我应该使用哪些锁提示(T-SQL)?

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

如下所示:

BEGIN TRAN A

SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10

/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/

COMMIT TRAN A

问题是,还有其他事务正在发生,消耗了我们库存中的数量,所以从选择记录到在事务A中写入更新之间,该记录可能会成为无效选择,因为它的数量可能已经降低到WHERE子句中的阈值以下。

迷迷迷迷提问于
等待你的阿公数据回答于
已采纳

实际上,设置事务隔离级别比使用查询提示更好。

akjok54stay hungry stay foolish回答于

WITH (HOLDLOCK)允许其他读者。UPDLOCK如其他地方所建议的那样是排他性的。

HOLDLOCK将阻止其他更新,但它们可能使用稍后更新的数据。

UPDLOCK将阻止任何人在提交或回滚之前读取数据。

你有没有看过SP(...这将允许您在不阻塞UPDLOCK的情况下序列化此代码(如果这是唯一的更新位)

问题主要在于这段代码在两个不同的会话中运行。具有HOLDLOCk或可重复_读取后,数据将在第一会话更新之前在第二会话中读取。使用UPDLOCK,任何人都不能在任何会话中读取数据。

扫码关注云+社区