乐观锁的关键是通过​​版本号​​判断数据是否被修改,确定操作是否成功

以下示例通过自增版本号的方式,判断是否更新数据

数据库为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
......

示例代码

​OptimisticLockTestDemo​



学习技术最好的文档就是​​【​官方文档​】​​,没有之一。

还有学习资料​​【​Microsoft Learn​】​​、【​CSharp Learn】、​​【​My Note​】​​。

如果,你希望更容易地发现我的新博客,不妨【​关注​】。