我想实现如下的原子事务:
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子句中使用什么锁定提示来防止在完成更新并提交事务之前更改选定的库存记录?
编辑:非常感谢John,一个好的解决方案似乎是将事务隔离级别设置为REPEATABLE READ.这将确保"在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据".
实际上,您可能最好设置事务隔离级别而不是使用查询提示.
以下联机丛书中的参考资料提供了每种不同隔离级别的详细信息.
http://msdn.microsoft.com/en-us/library/ms173763.aspx
这篇文章很好地解释了SQL Server中各种类型的锁定行为,并提供了示例.
http://www.sqlteam.com/article/introduction-to-locking-in-sql-server