一般来说,我对 EF 和 SQL 相当陌生,所以我可以使用一些帮助来澄清这一点。
假设我有一个表“钱包”(和 EF 代码第一个对象钱包),它有一个 ID 和一个余额。我需要做这样的操作:
if(wallet.balance > 100){
doOtherChecksThatTake10Seconds();
wallet.balance -= 50;
context.SaveChanges();
}
正如你所看到的,它检查一个条件是否有效,然后如果是,它必须首先执行一堆需要很长时间的其他操作(在这个夸张的例子中,我们说 10 秒),然后如果通过它就减去从钱包中取出 50 美元并保存新数据。
问题是,还有其他事情可以随时更改钱包余额(这是一个 Web 应用程序)。如果发生这种情况:
- 钱包余额 = 110;
- 此操作通过其“if”检查,因为 wallet.balance > 110
- 在执行“doOtherChecksThatTake10Seconds()”时,用户从钱包中转出 40 美元
- 现在 wallet.balance = 70
- “doOtherChecksThatTake10Seconds()”完成,从 wallet.balance 中减去 50,然后使用新数据保存上下文。
在这种情况下,wallet.balance > 100 的检查不再成立,但由于延迟,操作仍然发生。我需要找到一种方法来锁定表并且在整个操作完成之前不释放它,因此在此期间没有任何内容被编辑。最有效的方法是什么?
应该注意的是,我已经尝试将此操作放在 TransactionScope() 中,我不确定这是否会产生预期的效果,但我确实注意到它开始导致大量死锁,而正在运行的数据库操作完全不同.