Transaction And Lock--两种方式实现可重复读

一些需求要求两次查询数据之间不允许数据被修改,即可重复读取

可重复读REPEATABLE READ与串行化SERIALIZABLE的区别在于串行化要求满足该查询的数据不被修改且无新满足该查询条件的数据插入(使用范围锁),可重复读只要求数据不被修改(保留S锁至事务结束)。

而在read commit事务隔离级别下,被更新的数据会被加S锁,并一直保持事务提交或回滚,因此数据在事务区间内不能被其他事务修改,也保证了两次查询得到数据不发生变化(数据的值而不是行数)

因此我们可以使用几种方式来保持数据不发生变化:

方式1:在提交读隔离级别下使用HOLDLOCK
HOLDLOCK相当于SERIALIZABLE隔离级别,会对数据加范围锁(Range-S)共享锁S并一直保持到事务结束

方式2:在提交读隔离级别下对数据进行UPDATE
这样对数据加U锁,U锁会保持到事务结束,这样阻塞了其他事务对该数据的读取(U锁与S锁不兼容)

方式3:将隔离级别设置为
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ|SNAPSHOT|SERIALIZABLE

 

posted on   笑东风  阅读(388)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

点击右上角即可分享
微信分享提示