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

标签 c# database entity-framework-core locking

在下面的示例中,我们可能会遇到并发错误,如果发送方决定同时向 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/

相关文章:

c# - 在 RadDatePicker 中将当前 PC 日期和时间设置为默认值

mysql - 如何使用 C# 获取 Oracle、SQL Server、postgres、mysql 或任何其他数据库的数据库实例和架构详细信息?

MySQL:如何转换为 EAV?

c# - 什么是银光? (一句话,采访中)

c# - 分层.Net 文件格式?

c# - 如何使用 Entity Framework Core 的内存数据库提供程序测试数据库 View ?

sql - mysql select查询帮助--ORDER BY

c# - 使用 EF Core 在运行时确定正在使用哪个数据库提供程序

asp.net-core - Asp.Net Core 无法访问已处理的上下文实例

entity-framework - 尚未为此 DbContext 配置数据库提供程序