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