以下代码是我的业务层的一部分:
有时(每周一到两次)我会收到一个“TransactionInDoubtException”异常。堆栈跟踪:
据我所知,MySQL的默认隔离级别是可串行化的,因此这个原子操作应该没有问题。(假设没有由于写锁导致的超时问题)
那么我该如何解决我的问题呢?
public void IncrementHits(int ID)
{
using (var context = new MyEntities())
{
using (TransactionScope transaction = new TransactionScope())
{
Models.User userItem = context.User.First(x => x.IDUser == ID);
userItem.Hits++;
try
{
context.SaveChanges();
transaction.Complete();
}
catch (Exception ex)
{
transaction.Dispose();
throw;
}
}
}
}
有时(每周一到两次)我会收到一个“TransactionInDoubtException”异常。堆栈跟踪:
at System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()
据我所知,MySQL的默认隔离级别是可串行化的,因此这个原子操作应该没有问题。(假设没有由于写锁导致的超时问题)
那么我该如何解决我的问题呢?
userItem.Hits
。为此,OP 将选择(First
)和更新(SaveChanges
)封装到一个串行化级别的事务中。 - Evk