1

是否可以在 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 的行。但是,我想只锁定一张表中的行。

4

2 回答 2

2

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

您可以在 SELECT 语句中对表使用 XLOCK 提示,但请注意,它可能会锁定比您预期的更多,这通常取决于索引和数据的物理路径。

此外,使用 RCSI,它不会阻塞阅读器。

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

于 2016-09-30T10:04:37.763 回答
1

我认为 HOLDLOCK 表提示是您正在寻找的。从文档中

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

于 2016-09-30T15:02:30.333 回答