我需要执行原子操作检查某个实体框架模型字段的值,如果其值为0,则将其增加。
我考虑过事务,例如:
bool controlPassed = false;
using (TransactionScope scope = new TransactionScope())
{
var model = ...ModelEntities.first_or_default(...)
if (model.field == 0){
++model.field;
...saveChanges();
controlPassed = true;
}
scope.Complete();
}
if (controlPassed)
{
...
using (TransactionScope scope = new TransactionScope())
{
--model.field;
...saveChanges();
scope.Complete();
}
}
当然,所有的try catch都可以使用。
我的问题是:它将如何工作?
这真的很难检查。 我有多线程应用程序。
是否有可能,两个或多个线程会通过控制(检查field == 0
并增加它)?
谁会在数据库中被阻止(数据库、表、行、字段)?
我不能让两个或多个线程同时处于controlPassed
段中。
n
个线程,每个线程进入作用域,睡眠(以便将它们全部放在作用域内),每个线程从数据库中获取一些模型,检查字段是否为null,如果是,则再次睡眠并尝试保存更改。我得到的结果是需要一些时间(对于10秒,需要约15秒),而且只有一个线程能够通过控制。我认为EF正在尝试解决死锁问题。你知道这方面的任何信息吗? - Ari