这个问题有意思,我们不需要记,只要你装一个SQL Prompt,有了这个神器,你就知道到底有多少个?如下图:
DROP TABLE dbo.Person CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'xxxxx') INSERT INTO dbo.Person DEFAULT VALUES go 6
一眼扫下去,还是蛮多的,不过你要注意了,那些所谓的XXXLock才是我们需要关注的,根据上面的图,我们大概把锁分个类。。。
粒度锁:PAGLOCK, TABLOCK, TABLOCKX, ROWLOCK, NOLOCK
模式锁:HOLDLOCK, UPDLOCK, XLOCK
接下来我从粒度锁说起:
都说nolock是无锁模式的,那到底是怎样的无锁呢???到这篇为止,你应该知道,如果不加nolock,我们的表,数据页是附加IS锁的,那接
下来我用profile看下两者有什么区别。
从上图中,你会看到加上nolock之后,object上面附加了Sch-S锁,这个锁叫做“架构稳定锁”,很简单就是sql编译时附加的一把锁,目的就是
防止在编译时,有其他连接修改表结构,而这个锁只与Sch-M锁冲突,与其他锁都兼容,这说明什么?说明其他连接锁住了记录也没关系,我的
nolock不跟他们打交道,这样的话,就可能会读到脏数据,不过没关系,携程的很多业务是容许脏数据的,毕竟比锁等待,死锁要强得多,再说
nolock读到了其他连接未修改或者未提交的数据,这个概率也比较低,就算遇到了也没关系,一般不会招来客诉的,客人或许再刷下页面,数据
或许就正确了,对不对。。。
这个还是比较见名识义的,就是附加在table上的锁,也就是表锁了,很恐怖的。。。下面我举个Update的例子,看看前后对比。
在上面你有没有看到,X锁已经附加到OBJECT上面去了。。。这样的话,其他连接就动不了这个Object了,只能等待。。。
看了名字你应该也知道,就是附加到页面这个级别的锁,我也举一个Update的例子。
BEGIN TRAN UPDATE dbo.Person SET NAME='aaaaa' WHERE ID=6 BEGIN TRAN UPDATE dbo.Person WITH(PAGLOCK) SET NAME='bbbbb' WHERE ID=4
从上面两个图中,你应该可以看到,原来附加到RID上面的U锁,由于PagLock的提升,现在要附加到Page上面了,这个就是所谓的数据页锁。
这两个我就不细说了,TABLOCKX就是直接附加在table上的X锁,你可以通过select看一下。
ROWLOCK的话,默认情况下就是ROWLOCK,比如默认的Update,你会发现RID上被附加的U锁,这个就是行锁。
这个锁还是蛮有意思的,它就是update锁,如果你select下,它会呈现update的锁痉挛效果。
知道了UPDLOCK锁,我想XLOCK你也应该明白了。。。它就是delete锁,即排他锁,我可以让select带上排他锁。
最后一个我也没闹明白,据说是让语句在整个事务中持有锁,然后我就用select和update调试一下。
SELECT * FROM dbo.Person(HOLDLOCK) UPDATE dbo.Person WITH(HOLDLOCK) SET NAME='bbbbb' WHERE ID=4
从图中可以看到,HOLDLOCK不管是在select还是Update中,都是对表持有锁。