实体框架TransactionScope回滚问题

本文关键字:问题 TransactionScope 框架 实体 | 更新日期: 2023-09-27 18:14:15

我正在使用带有TransactionScope的实体框架。看起来我遇到了一个问题,如果在调用TransactionScope的Complete()方法后出现死锁问题,那么我的所有更改都不会回滚。注意,在这个TransactionScope中,我正在更新两个独立的数据库,所以问题可能是它只回滚发生死锁问题的数据库的更改?

代码示例:

try
{
    using (TransactionScope scope = new TransactionScope())
    {
        //Insert into database1 (getting the deadlock issue)
        database1.SaveChanges();
        //Update ExternalId (Identity PK from database1) in database2
        database2.SaveChanges();
        scope.Complete();
    }
}
catch (Exception ex)
{
    throw;
}

在上面的例子中,database2获得更新的ExternalId列,但记录从未插入到database1中,这很奇怪,因为ExternalId是我们在向database1插入记录时获得的身份记录。

实体框架TransactionScope回滚问题

如果您的连接是在TransactionScope之外创建(并打开?)的,那么需要通过调用Connection.EnlistTransaction(Transaction.Current);来手动将其登记到事务中。例如

try
{
    using (TransactionScope scope = new TransactionScope())
    {
        database1.Connection.EnlistTransaction(Transaction.Current);
        database2.Connection.EnlistTransaction(Transaction.Current);
        //Insert into database1 (getting the deadlock issue)
        database1.SaveChanges();
        //Update ExternalId (Identity PK from database1) in database2
        database2.SaveChanges();
        scope.Complete();
    }
}
catch (Exception ex)
{
    throw;
}