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

posted @ 2022-03-03 19:33  Lulus  阅读(827)  评论(0编辑  收藏  举报