是否可以在SQL SERVER中的事务中使用SELECT语句锁定行

时间:2016-09-30 08:56:49

标签: sql-server transactions rowlocking

在SQL SERVER中,是否可以在事务中使用SELECT语句锁定行?我想锁定该行,因此来自外部的其他事务无法到达该行。

提交或回滚事务后,应该释放该行。这就是我的意思......

BEGIN TRANSACTION TRAN1

SELECT * FROM HR.Employees WITH (UPDLOCK) WHERE empid=1
...
...
...
...
COMMIT TRANSACTION

有人有建议吗?我应该使用UPDATE语句来锁定行吗?

请不要将此问题标记为重复。因为,我不是在询问UPDATE语句,而是询问SELECT

编辑:我试图'设置交易隔离级别可串行',但这会锁定太多东西。我的SP很庞大,它有很多SELECT语句。 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE'锁定SP中所有SELECT的行。但是,我想只锁定一个表中的行。

2 个答案:

答案 0 :(得分:2)

UPDATE锁是一种特殊的锁,当更新语句正在搜索要更新的行时使用。它与SHARED锁兼容,因此它可以增加并发性,并且还可以在转换为XLOCK时最大限度地减少转换死锁的可能性。

您可以在SELECT语句中对表使用XLOCK提示,但请注意它可能会锁定超出预期的数量,具体取决于索引和数据的物理路径。

此外,对于RCSI,它不会阻止读者。

最好在这里使用其他一些应用程序控制的逻辑,而不是依赖SQL Server的锁定机制。

答案 1 :(得分:1)

我认为HOLDLOCK表提示是您正在寻找的。来自the documentation

  

HOLDLOCK   相当于SERIALIZABLE。有关更多信息,请参阅本主题后面的SERIALIZABLE。 HOLDLOCK仅适用于指定它的表或视图,并且仅适用于由其使用的语句定义的事务的持续时间.HOLDLOCK不能在包含FOR BROWSE选项的SELECT语句中使用。