在没有数据争用的情况下转移资金

时间:2018-07-31 19:48:55

标签: c# sql-server entity-framework-core

问题:爱丽丝(Person的事例)想将$ 20转移给鲍勃(Person的事例)。

表格:

public class Person
{
    public int Id { get; set; }

    public Collection<Account> Accounts { get; set; }
}

public class Account
{
    public int Id { get; set; }
    public int Money { get; set; }

    public int PersonId { get; set; }
    public Person Person { get; set; }
}

经常账户:

  

爱丽丝:30美元

     

鲍勃:0美元

该服务检查Alice是否有足够的钱,然后进行转移。但是问题会发生,同时发生第二次转帐,也想转账20美元(例如,双击“转账”按钮)。

代码如下:

int aliceId = 1;
int bobId = 2;
bool sufficientMoney = Accounts.Any(x => x.PersonId == aliceId && x.Money >= 20);

if (sufficientMoney)
{
    Person aliceAccount = Accounts.FirstOrDefault(x => x.PersonId == aliceId);

    Person bobAccount = Accounts.FirstOrDefault(x => x.PersonId == aliceId);

    using (var transaction = context.Database.BeginTransaction())
    {
        aliceAccount.Money -= 20;
        bobAccount.Money += 20;

        transaction.Commit();
    }
}

可能会发生两次从数据库中读取的结果,返回爱丽丝有足够的钱,第一个请求执行有效的转账,第二个请求之后执行,使爱丽丝剩下了负数(无效)的钱,而鲍勃得到了钱不存在。

0 个答案:

没有答案