TABLOCK
和 TABLOCKX
的区别是什么?
根据http://msdn.microsoft.com/en-us/library/ms187373.aspx,TABLOCK
是共享锁,而TABLOCKX
是独占锁。第一个可能只是一种索引锁吗?分享锁的概念是什么?
TABLOCK
和 TABLOCKX
的区别是什么?
根据http://msdn.microsoft.com/en-us/library/ms187373.aspx,TABLOCK
是共享锁,而TABLOCKX
是独占锁。第一个可能只是一种索引锁吗?分享锁的概念是什么?
这两种锁的主要区别在于,TABLOCK
会尝试获取“共享”锁,而 TABLOCKX
则是独占锁。
如果您正在事务中并在表上获取独占锁,例如:
SELECT 1 FROM TABLE WITH (TABLOCKX)
那么其他进程将无法在该表上获取任何锁,这意味着所有试图访问该表的查询都将被阻止,直到事务提交。
TABLOCK
只会获取一个共享锁,如果您的事务隔离级别是READ COMMITTED
(默认设置),则共享锁会在语句执行后释放。如果您的隔离级别更高,例如:SERIALIZABLE
,则共享锁将保留直到事务结束。
共享锁是可共享的。这意味着,如果两个事务都通过 TABLOCK
在表上持有S或IS锁,则它们都可以同时从表中读取数据。但是,如果事务A
在表上持有共享锁,则事务B
在所有共享锁释放之前将无法获取独占锁。了解哪些锁与哪些锁兼容。
这两个提示都会让数据库绕过获取更精细的锁(例如行或页级别的锁)。原则上,更精细的锁允许您获得更好的并发性。因此,例如,一个事务可以在您的表中同时更新第100行和第1000行,并且另一个事务也可以在同时执行(这在页面锁定时会变得棘手,但让我们跳过这个)。
通常情况下,您需要使用颗粒锁,但有时您可能希望减少数据库并发以提高特定操作的性能并消除死锁的可能性。
通常情况下,您不会使用TABLOCK
或TABLOCKX
,除非您绝对需要它来处理某些边缘情况。
它没有涉及“意图”(这基本上是这些锁类型的修饰符)。意图(共享/独占)锁是在真正的锁定级别高于实际锁定级别的级别保持的锁。例如,如果您的事务对一行具有X锁定,则它还将在表级别上具有IX锁定(这样就阻止了其他事务在您的事务完成或回滚之前尝试在表上的更高级别上获取不兼容锁定,例如模式修改锁定)。共享锁用于不对数据进行更改或更新的操作,例如SELECT语句。
当SQL Server打算修改页面时,会使用更新锁,并在实际进行更改之前将更新页面锁提升为独占页面锁。
排他锁用于数据修改操作,例如UPDATE、INSERT或DELETE。
tablockx
将获取X锁。 - Sam Saffron
TABLOCK
是一个共享锁,允许多个客户端同时将数据加载到表中。而排它锁则不行。 - Lieven Keersmaekers