在下面的示例中,我们可能会遇到并发错误,如果发送方决定同时向 2 个不同的接收方发送资金,那么两个接收方都可能收到资金,而发送方只会被收取一次费用。
public async Task SendMoney(int amount, int sender, int receiver)
{
await using var dbContext = new ApplicationDbContext();
var person1 = await dbContext.Persons.FirstOrDefaultAsync(p => p.Id == sender);
var person2 = await dbContext.Persons.FirstOrDefaultAsync(p => p.Id == receiver);
if (person1.Balance >= amount)
{
person1.Balance -= amount;
person2.Balance += amount;
}
await dbContext.SaveChangesAsync();
}
避免这种情况并确保此操作安全的最佳方法是什么?
通过添加时间戳属性引入乐观锁定[Timestamp] public byte[] Version { get;放; }
到 Person
模型足以确保无法重复资金?
我最关心的是避免重复的安全性。正确处理 DbUpdateConcurrencyException 等异常以提供流畅的用户体验不是我的问题的一部分。
最佳答案
在并发环境中[Timestamp]
将确保仅当该行自从数据库加载以来未更改时才保存,因此它可以工作。
另外,对于您提供的情况,可以将 Balance
字段设置为 Concurrency Token .
关于c# - 乐观锁定足以确保资金转账等操作的安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68236336/