gpt4 book ai didi

c# - 乐观锁定是否足以确保资金转移等操作的安全?

转载 作者:行者123 更新时间:2023-12-04 07:25:32 24 4
gpt4 key购买 nike

在下面的例子中,我们可能会遇到并发错误,如果发送者决定同时向 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; set; }Person模型足以确保没有重复资金的方法?
我主要关心避免重复的安全性。正确处理 DbUpdateConcurrencyException 等异常为了提供流畅的用户体验不是我的问题的一部分。

最佳答案

在并发环境中 [Timestamp]将确保仅在从数据库加载后未更改该行时才保存该行,因此它将起作用。
同样对于您提供的情况,可以设置 Balance字段为 Concurrency Token .

关于c# - 乐观锁定是否足以确保资金转移等操作的安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68236336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com