【发布时间】:2015-06-07 10:05:15
【问题描述】:
假设我有一个account_profile 表,它的Score 字段类似于帐户的钱(数据库类型是BIGINT(20),EntityFramework 类型是long,因为我不需要小数) .现在我有以下功能:
public long ChangeScoreAmount(int userID, long amount)
{
var profile = this.Entities.account_profile.First(q => q.AccountID == userID);
profile.Score += amount;
this.Entities.SaveChanges();
return profile.Score;
}
但是,我担心当ChangeScoreAmount被同时调用多次时,最终的数量将不正确。
这是我目前正在考虑的解决方案:
-
在
ChangeScoreAmount函数中添加一个带有静态锁定变量的锁,因为类本身可能在需要时被实例化多次。它看起来像这样:public long ChangeScoreAmount(int userID, long amount) { lock (ProfileBusiness.scoreLock) { var profile = this.Entities.account_profile.First(q => q.AccountID == userID); profile.Score += amount; this.Entities.SaveChanges(); return profile.Score; } }
问题是,我从未尝试过锁定static 变量,所以我不知道它是否真的安全,是否会发生死锁。此外,如果在此函数之外的其他地方,中途应用了对 Score 字段的更改,则可能会很糟糕。
好的,这不再是一个选项,因为我的服务器应用程序将在多个站点上运行,这意味着无法使用锁定变量
- 在数据库中创建存储过程并在函数中调用该存储过程。但是,我不知道是否有一种“原子”方式来创建该存储过程,以便一次只能调用一次,因为我仍然需要检索值,更改它然后再次更新它?
我正在使用 MySQL Community 5.6.24 和 MySQL .NET Connector 6.9.6,以防万一。
注意我的服务器应用程序可能在多台服务器机器上运行。
【问题讨论】:
标签: c# mysql entity-framework transactions atomic