1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。????
- ?begin???tran????
-
??declare???@a???int????
- ??select???@a=a???from???tb???with(holdlock)
- ??where???a=1????
- ?????
-
??waitfor???delay???'00:00:10'????
- ?????
- ??select???*???from???tb????
- ??commit???tran????
- ??go????
-
--update???tb???set???a=2000??
- INSERT?INTO?tb
- VALUES(1)
- --select???*???from???tb
执行holdlock后,INSERT?INTO?tb执行,事务中的select???*???from???tb????获得最新数据
holdlock 锁定匹配的行记录,未匹配到全锁
?
2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。???? 3. PAGLOCK:指定添加页锁(否则通常可能添加表锁)。?? 4. READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。。?? 5. READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁,READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作。??? 6. READUNCOMMITTED:等同于NOLOCK。???? 7. REPEATABLEREAD:设置事务为可重复读隔离性级别。?? 8. ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。???
sqlserver锁定一行的最小锁是?
http://www.cnblogs.com/jll/articles/1240207.html? 9. SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。? 10. TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。???? 11. TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。?? 12. UPDLOCK :指定在读表中数据时设置更新 锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。??读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK ? 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
- --做一下下面的两个测试,也许对理解有帮助???
- ????
- ??--------------------------------------------???
- ??--?????测试1,使用???updlock?????
- ??--------------------------------------------???
- ??--a.创建这样一个测试表???
-
??create???table???tb(a???int)???
- ??insert???tb???select???1???
- ??union???all???select???2???
- ??go???
- ????
- ??--b.查询分析器中新开一个窗口,执行下面的语句???
- ??begin???tran???
-
??declare???@a???int???
- ??select???@a=a???from???tb???with(updlock)???
- ??where???a=1???
- ????
-
??waitfor???delay???'00:00:10'???
- ????
- ??select???*???from???tb???
- ??commit???tran???
- ??go???
- ????
- ??--c.再在查询分析器中新开一个窗口,执行下面的语句???
-
??update???tb???set???a=200???
- ????
- ??--结果:???c窗口中的update???会一直等待到b窗口中的事务提交后再执行???
- ??--?????????????可以得到这个结论是因为在b窗口出结果前,c???窗口一直等待???
- ??--?????????????而且b窗口得到的结果是a列没有被更新前的值???
- ??go???
- ??--删除测试环境???
- ??drop???table???tb???
- ????
- ????
- ????
- ????
- ??--------------------------------------------???
- ??--?????测试2,不使用???updlock?????
- ??--------------------------------------------???
- ??--a.创建这样一个测试表???
-
??create???table???tb(a???int)???
- ??insert???tb???select???1???
- ??union???all???select???2???
- ??go???
- ????
- ??--b.查询分析器中新开一个窗口,执行下面的语句???
- ??begin???tran???
-
??declare???@a???int???
- ??select???@a=a???from???tb???
- ??where???a=1???
- ????
-
??waitfor???delay???'00:00:10'???
- ????
- ??select???*???from???tb???
- ??commit???tran???
- ??go???
- ????
- ??--c.再在查询分析器中新开一个窗口,执行下面的语句???
-
??update???tb???set???a=200???
- ????
- ??--结果:???c窗口中的update???立即执行,并没有等待b窗口中的事务提交???
- ??--?????????????可以得到这个结论是因为在b窗口出结果前,c???窗口已经处理完成???
- ??--?????????????而且b窗口得到的结果是a列更新后的值???
- ??go???
- ????
- ??--删除测试环境???
- ??drop???table???tb
updlock 锁定匹配的记录,未匹配到不锁 锁之外的更新,可以更新未匹配到的记录
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|