是否可以在 SQL SERVER 的事务中用 SELECT 语句锁定一行
Is it possible to lock a row with SELECT statement in transaction in SQL SERVER
是否可以在 SQL SERVER 的事务中用 SELECT 语句锁定一行?我想锁定该行,这样来自外部的其他事务无法到达该行。
事务提交或回滚后,该行应该被释放。这就是我的意思...
BEGIN TRANSACTION TRAN1
SELECT * FROM HR.Employees WITH (UPDLOCK) WHERE empid=1
...
...
...
...
COMMIT TRANSACTION
有人有什么建议吗?我应该执行 UPDATE 语句来锁定该行吗?
请不要将此问题标记为重复。因为,我不是在询问 UPDATE 语句,而是在询问 SELECT
编辑:我试过 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE' 但这会锁定太多东西。我的 SP 很大,里面有很多 SELECT 语句。 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE' 锁定 SP 中所有 SELECT 的行。但是,我只想锁定一个 table.
中的行
UPDATE 锁是一种特殊的锁,在更新语句搜索要更新的行时使用。它与 SHARED 锁兼容,因此它增加了并发性,并且还最大限度地减少了转换为 XLOCK 时发生转换死锁的机会。
您可以在 SELECT 语句中对 table 使用 XLOCK 提示,但请注意,它可能会锁定比您预期的更多的锁,这通常取决于索引和数据的物理路径。
此外,使用 RCSI,它不会阻塞读者。
最好在这里使用一些其他应用程序控制的逻辑,而不是依赖 SQL 服务器的锁定机制。
我认为 HOLDLOCK table 提示正是您要查找的内容。来自 the documentation:
HOLDLOCK
Is equivalent to SERIALIZABLE. For more information, see SERIALIZABLE later in this topic. HOLDLOCK applies only to the table or view for which it is specified and only for the duration of the transaction defined by the statement that it is used in. HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.
是否可以在 SQL SERVER 的事务中用 SELECT 语句锁定一行?我想锁定该行,这样来自外部的其他事务无法到达该行。
事务提交或回滚后,该行应该被释放。这就是我的意思...
BEGIN TRANSACTION TRAN1
SELECT * FROM HR.Employees WITH (UPDLOCK) WHERE empid=1
...
...
...
...
COMMIT TRANSACTION
有人有什么建议吗?我应该执行 UPDATE 语句来锁定该行吗?
请不要将此问题标记为重复。因为,我不是在询问 UPDATE 语句,而是在询问 SELECT
编辑:我试过 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE' 但这会锁定太多东西。我的 SP 很大,里面有很多 SELECT 语句。 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE' 锁定 SP 中所有 SELECT 的行。但是,我只想锁定一个 table.
中的行UPDATE 锁是一种特殊的锁,在更新语句搜索要更新的行时使用。它与 SHARED 锁兼容,因此它增加了并发性,并且还最大限度地减少了转换为 XLOCK 时发生转换死锁的机会。
您可以在 SELECT 语句中对 table 使用 XLOCK 提示,但请注意,它可能会锁定比您预期的更多的锁,这通常取决于索引和数据的物理路径。
此外,使用 RCSI,它不会阻塞读者。
最好在这里使用一些其他应用程序控制的逻辑,而不是依赖 SQL 服务器的锁定机制。
我认为 HOLDLOCK table 提示正是您要查找的内容。来自 the documentation:
HOLDLOCK Is equivalent to SERIALIZABLE. For more information, see SERIALIZABLE later in this topic. HOLDLOCK applies only to the table or view for which it is specified and only for the duration of the transaction defined by the statement that it is used in. HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.