【发布时间】:2009-01-30 20:10:51
【问题描述】:
我想实现一个原子事务,如下所示:
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。这将确保“在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。”
【问题讨论】:
-
好问题...我很快就会编写一些完全符合此标准的代码...我什至没有意识到这是一个问题:)
-
谢谢安德鲁!是的,我突然想到,如果数据或交易使用的假设在处理过程中发生了变化,那么交易并没有真正产生一致的结果。
标签: sql sql-server tsql concurrency locking