【发布时间】:2010-11-20 23:33:27
【问题描述】:
好的,我尝试搜索并没有找到答案 - 我很好奇 ROLLBACK 如何处理竞争条件。例如:
如果我有一个表 (CompanyAccount),它记录了一家公司有多少积分可供购买(每家公司的数据库表中只有一行)并且可能有来自同一家公司的多个用户可以递减来自单个公司账户的贷方,如果发生 ROLLBACK 时出错怎么办?
例子:
假设:我已经正确编写了更新来计算“信用”新余额,而不是猜测新的信用余额是什么(即我们不试图告诉 UPDATE 语句新的信用余额/价值是什么,我们说取信用列中的任何内容并在 UPDATE 语句中减去我的减量值)...
以下是更新语句的编写示例:
更新 dbo.CompanyAccount SET Credit = Credit - @DecrementAmount WHERE CompanyAccountId = @CompanyAccountId
如果“信用”列有 10,000 个信用。用户 A 导致减少 4,000 个信用,而用户 B 导致减少 1000 个信用。出于某种原因,在用户 A 的递减期间触发了回滚(在 TRANSACTION 期间,大约有 1/2 多张表的行被插入)。如果用户 A 赢得竞争条件并且新余额为 6,000(但尚未提交),如果用户 B 的递减发生在应用回滚之前会发生什么?余额栏是否从 6,000 变为 5,000,然后 ROLLBACK 变为 10,000?
我不太清楚 ROLLBACK 将如何处理这个问题。也许我过于简单化了。如果我误解了 ROLLBACK 的工作原理,或者我需要担心这种风格的其他风险,有人可以告诉我。
感谢您的意见。
【问题讨论】:
标签: sql-server-2005 transactions race-condition rollback