1. java多用戶同時修改一條數據時樂觀鎖怎麼用的
你說的這個version是mysql底層的鎖機制提供的,並不是java提供的。
使用數據版本(Version)記錄機制實現,這是mysql樂觀鎖最常用的一種實現方式。所謂的數據版本就是給數據增加一個版本標識,一般是通過為資料庫表增加一個數字類型的 「version」 欄位來實現。當讀取數據時,將version欄位的值一同讀出,數據每更新一次,對此version值加1。當我們提交更新的時候,判斷資料庫表對應記錄的當前版本信息與第一次取出來的version值進行比對,如果資料庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期數據,版本號重新讀取再做更新。
2. C# 資料庫批量更新問題
有一個辦法,可能是你想要的。但是不保證一定能實現你的目的。
在C#中有一個SqlCommandBuilder類,該類用來批量自動更新表數據變化,
說是自動更新,其實是根據已知的select語句,來自動生成其他的update,delete語句。
我以前項目的sqlhelper中,用這個類自定義過批量更新方法,在winform中使用一切ok。方法發你,看有用沒。
有些細節一定要注意的是,表狀態決定表數據的操作,比如表某行狀態是修改,那麼SqlCommandBuilder會執行update。但是這個狀態你要控制好。另外,你傳遞的select語句,一定要和你所構造的表結構接近吻合。看方法。
/// <summary>
/// operare database by commandbuilder
/// </summary>
/// <param name="connectinString">connectinString</param>
/// <param name="commandString">commandString</param>
/// <param name="sourceDable">do update or insert database table</param>
public static int ExecuteByCommandBuilder(string connectinString, string commandString, DataTable sourceDable, SqlParameter sqlparam)
{
SqlConnection sqlcon = new SqlConnection();
sqlcon.ConnectionString = connectinString;
using (SqlCommand sqlcommand = new SqlCommand(commandString, sqlcon))
{
if (sqlparam != null)
{ sqlcommand.Parameters.Add(sqlparam); }
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlcommand;
//DataSet ds = new DataSet();
//da.Fill(ds);
//ds.Tables[0].Merge(sourceDable, false);
SqlCommandBuilder sqlcommandbuilder = new SqlCommandBuilder(da);
return da.Update(sourceDable);
}
}