当UPDLOCK在SQL服务器中发布时?

最近我已经通过SQL服务器中的提示和锁定了。 虽然谷歌关于这个话题,我已经阅读了一个博客,其中一些查询已被写入,我不打包理解。 这里是

BOL声明:在读表时使用更新锁而不是共享锁,并保持锁直到语句或事务结束。 我在翻译这个时遇到了一些麻烦。 这是否意味着更新锁在执行SELECT语句后被释放,除非事务中的SELECT语句?

换句话说,我的假设在以下两种情况下是正确的吗?

情况1:没有交易

SELECT something FROM table WITH (UPDLOCK)

/* update locks released */

情景2:与交易

BEGIN TRANSACTION 
SELECT something FROM table WITH (UPDLOCK)

/* some code, including an UPDATE */
COMMIT TRANSACTION

/* update locks released */

场景2的示例(参考stackoverflow博客)

BEGIN TRAN

SELECT Id FROM Table1 WITH (UPDLOCK)
WHERE AlertDate IS NULL;

UPDATE Table1 SET AlertDate = getutcdate() 
WHERE AlertDate IS NULL;

COMMIT TRAN 

请帮助理解上述查询。

我的第二个问题是:一旦select语句的执行完成UPDLOCK被释放或不被释放?


你在场景2中的假设是正确的。

要回答你的第二个问题,不。 更新锁保留在选定的行上,直到事务结束,或者直到更新语句修改这些行时转换为排它锁。 使用SSMS逐个检查每个陈述以验证。

BEGIN TRAN
    -- execute sp_lock in second session - no locks yet
    SELECT Id FROM Table1 WITH (UPDLOCK) WHERE AlertDate IS NULL;
    -- execute sp_lock in second session - update locks present
    UPDATE Table1 SET AlertDate = getutcdate() WHERE AlertDate IS NULL;
    -- execute sp_lock in second session - update (U) locks are replace by exclusive locks (X) for all row(s) returned by SELECT and modified by the UPDATE (Lock Conversion).
    -- Update locks (U) continue to be held for any row(s) returned by the SELECT but not modified by the UPDATE
    -- exclusive locks (X) are also held on all rows not returned by SELECT but modified by UPDATE. Internally, lock conversion still occurs, because UPDATE statements must read and write.
COMMIT TRAN 

    -- sp_lock in second session - all locks gone.

至于场景1中发生的事情,所有T-SQL语句都存在于隐式事务或显式事务中。 Senario 1是隐含的:

BEGIN TRAN
     SELECT something FROM table WITH (UPDLOCK)
     -- execute sp_lock in second session - update locks (U) will be present
     COMMIT TRAN;
     -- execute sp_lock in second session - update locks are gone.

这是否意味着更新锁在执行SELECT语句后被释放,除非事务中的SELECT语句?

只要行被读取,锁就会被释放......但锁保持将是U锁,因此任何试图修改它的并行事务都必须等待

如果你在事务中选择了上面的select,那么只有当事务被提交时锁才会被释放,所以任何获取与U锁不兼容的并行事务都将不得不等待

begin tran
select * from t1 with (updlock)

对于下面的第二种情况

BEGIN TRANSACTION 
SELECT something FROM table WITH (UPDLOCK)

/* some code, including an UPDATE */
COMMIT TRANSACTION

试想一下,如果你的选择查询返回100行,都将使用U锁和想象在同一个事务的更新会影响两行,两行会被转换为x锁。所以现在您的查询将有98个u锁和2 x锁,直到交易承诺

我想认为Updlock是可重复读取的,可以添加任何新行,但任何并行事务都不能删除或更新现有行

链接地址: http://www.djcxy.com/p/32837.html

上一篇: When UPDLOCK get released in SQL server?

下一篇: LOCK IN SHARE MODE locks entire table