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 锁定匹配的记录,未匹配到不锁 锁之外的更新,可以更新未匹配到的记录
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。