一些需求要求两次查询数据之间不允许数据被修改,即可重复读取
可重复读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