C# 实现乐观锁
乐观锁的关键是通过版本号
判断数据是否被修改,确定操作是否成功
以下示例通过自增版本号的方式,判断是否更新数据
数据库为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
......
示例代码
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的【推荐】按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。