我正在处理的情况是我们正在处理金钱交易。
例如,我有一个用户钱包表,其余额位于该行。
UserId; Wallet Id; Balance
现在,在我们的网站和网络服务中,每次发生特定交易时,我们都需要:
- 检查是否有足够的资金可用于执行该交易:
- 从余额中扣除交易费用。
在我的事务的整个持续时间内锁定该行/实体的正确方法是什么?
根据我的阅读,有一些解决方案,其中 EF 标记一个实体,然后在将其保存回数据库时比较该标记,但是当另一个用户/程序已经编辑了该金额时,它会做什么?
我可以通过 EF 实现这一目标吗?如果没有,我还有什么其他选择?
调用存储过程是否可能允许我正确锁定该行,以便在程序 A 锁定该行时其他人无法访问 SQL Server 中的该行?
EF 没有内置锁定机制,您可能需要使用原始查询,例如
using (var scope = new TransactionScope(...))
{
using (var context = new YourContext(...))
{
var wallet =
context.ExecuteStoreQuery<UserWallet>("SELECT UserId, WalletId, Balance FROM UserWallets WITH (UPDLOCK) WHERE ...");
// your logic
scope.Complete();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)