樂觀鎖的關鍵是通過版本號
判斷數據是否被修改,確定操作是否成功
以下示例通過自增版本號的方式,判斷是否更新數據
數據庫為sqlite數據庫,包含一張myresource
表,字段為Id
、Version
、Resource
其中Id
為主鍵,Version
為版本號,Resource
為業務數據
關鍵代碼
using(DbConnection connection = new DbConnection(dbConnectionString))
{
var resource = connection.Query<MyResource>("select Id,Version,Resource from myresource where Id=1").FirstOrDefault();
//模擬進行了一些耗時業務處理
Thread.Sleep(100);
var oldVersion = resource.version;
//核心是根據Id+版本號進行更新,更新數為0,則表示更新失敗
if (connection.ExecuteNonQuery($"update myresource set Resource={++resource.resource},Version={++resource.version} where Id={resource.Id} and Version={oldVersion}") == 1)
{
Console.WriteLine($"修改數據成功:當前數據為{resource.resource},當前版本號為{resource.version}");
}
else
{
Console.WriteLine("版本號變更,不能修改數據");
}
}
輸出結果
修改數據成功:當前數據為2,當前版本號為2
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為3,當前版本號為3
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為4,當前版本號為4
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為5,當前版本號為5
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為6,當前版本號為6
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為7,當前版本號為7
版本號變更,不能修改數據
版本號變更,不能修改數據
版本號變更,不能修改數據
修改數據成功:當前數據為8,當前版本號為8
......