SqlServer使用事务注意事项,高级程序员必背( 二 )


5.1SNAPSHOT
SNAPSHOT 在SNAPSHOT隔离级别下,当读取数据时可以保证操作读取的行是事务开始时可用的最后提交版本
同时SNAPSHOT隔离级别也满足前面的已提交读,可重复读,不幻读;该隔离级别实用的不是共享锁,而是行版本控制
使用SNAPSHOT隔离级别首先需要在数据库级别上设置相关选项
5.2READ COMMITTED SNAPSHOT
READ COMMITTED SNAPSHOT也是基于行版本控制,但是READ COMMITTED SNAPSHOT的隔离级别是读操作之前的最后已提交版本,而不是事务前的已提交版本,有点类似前面的READ COMMITTED能保证已提交读,但是不能保证可重复读,不能避免幻读,但是又比 READ COMMITTED隔离级别多出了不需要获取共享锁就可以读取数据,说了理论,下面直接上代码进行分析:
SqlServer【锁】注意事项
一、页锁实例T1: select * from table (paglock)
T2: update table set column1='hello' where id>10
【SqlServer使用事务注意事项,高级程序员必背】说明
T1执行时,会先对第一页加锁,读完第一页后,释放锁,再对第二页加锁,依此类推 。假设前10行记录恰好是一页(当然,一般不可能一页只有10行记录),那么T1执行到第一页查询时,并不会阻塞T2的更新 。
----------------------------------------------------------------------------------------------------
二、行锁实例T1: select * from table (rowlock)
T2: update table set column1='hello' where id=10
说明
T1执行时,对每行加共享锁,读取,然后释放,再对下一行加锁;T2执行时,会对id=10的那一行试图加锁,只要该行没有被T1加上行锁,T2就可以顺利执行update操作 。
----------------------------------------------------------------------------------------------------
三、整表锁实例
T1: select * from table (tablock)
T2: update table set column1='hello' where id = 10
说明
T1执行,对整个表加共享锁 。T1必须完全查询完,T2才可以允许加锁,并开始更新 。
----------------------------------------------------------------------------------------------------
以上是sql锁的一些常用技巧,希望对大家有帮助 。




推荐阅读