在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的行。但是,我想只锁定一个表中的行。
答案 0 :(得分:2)
UPDATE锁是一种特殊的锁,当更新语句正在搜索要更新的行时使用。它与SHARED锁兼容,因此它可以增加并发性,并且还可以在转换为XLOCK时最大限度地减少转换死锁的可能性。
您可以在SELECT语句中对表使用XLOCK提示,但请注意它可能会锁定超出预期的数量,具体取决于索引和数据的物理路径。
此外,对于RCSI,它不会阻止读者。
最好在这里使用其他一些应用程序控制的逻辑,而不是依赖SQL Server的锁定机制。
答案 1 :(得分:1)
我认为HOLDLOCK表提示是您正在寻找的。来自the documentation:
HOLDLOCK 相当于SERIALIZABLE。有关更多信息,请参阅本主题后面的SERIALIZABLE。 HOLDLOCK仅适用于指定它的表或视图,并且仅适用于由其使用的语句定义的事务的持续时间.HOLDLOCK不能在包含FOR BROWSE选项的SELECT语句中使用。