admin

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

sql

我想实现一个原子事务,如下所示:

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子句中。

所以问题是,在我完成更新并提交事务之前,我应该在WITH子句中使用哪些锁定提示来防止更改选定的库存记录?

编辑:因此,感谢约翰,一个好的解决方案似乎是将事务隔离级别设置为REPEATABLE
READ。这将确保“在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据”。


阅读 143

收藏
2021-05-10

共1个答案

admin

实际上,最好设置事务隔离级别,而不要使用查询提示。

联机丛书中的以下参考资料提供了每个不同隔离级别的详细信息。

http://msdn.microsoft.com/en-
us/library/ms173763.aspx

这是一篇很好的文章,解释了SQL Server中各种类型的锁定行为,并提供了示例。

http://www.sqlteam.com/article/introduction-to-locking-in-sql-
server

2021-05-10