C# 實現樂觀鎖


樂觀鎖的關鍵是通過版本號判斷數據是否被修改,確定操作是否成功
以下示例通過自增版本號的方式,判斷是否更新數據
數據庫為sqlite數據庫,包含一張myresource表,字段為IdVersionResource
其中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
......

示例代碼

OptimisticLockTestDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM