【发布时间】:2017-08-16 03:48:34
【问题描述】:
最近我在 SQL Server 中使用了提示和锁。虽然谷歌关于这个话题我读过一篇博客,其中写了一些我无法理解的查询。这里是
BOL 状态:在读取表时使用更新锁而不是共享锁,并持有锁直到语句或事务结束。我翻译这个有点麻烦。这是否意味着在SELECT语句执行后更新锁被释放,除非SELECT语句在一个事务中?
换句话说,我在以下 2 个场景中的假设是否正确?
场景一:没有交易
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 会被释放吗?
【问题讨论】:
-
实际上,在场景 1 中,说“无事务”并不完全正确 - 您确实有一个 隐式 事务,只是为了 @ 987654325@ 语句 - 一旦
SELECT返回就完成,因此UPDLOCK被释放 - 在隐式事务完成后
标签: sql-server transactions locking database-administration query-hints