我想确认实体框架的ObjectContext.Connection.BeginTransaction()方法返回的事务是否使用MSDTC(Microsoft分布式事务处理协调器)的支持?

没有MSDTC的支持,有什么方法可以使用事务?

最佳答案

在某些条件下,它将自动升级为MSDTC协调的交易。每次调用ObjectContext.SaveChanges()时,如果作用域中还没有一个新事务,则会创建一个新事务(如果作用域中已经有一个活动事务,它将登记在该事务中)。但是,默认情况下,每次调用ObjectContext.SaveChanges()时,连接也将打开和关闭。因此,如果您要在方法开始时调用ObjectContext.Connection.BeginTransaction(),然后使用某些版本的SQL Server和Entity Framework保留原始事务时多次调用ObjectContext.SaveChanges(),则可能导致该事务被提升为MSDTC因为它现在在单个事务中使用不同的连接。如果要避免将事务升级为MSDTC,请在开始时显式打开连接,并在完成后关闭连接:

using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();
    DbTransaction transaction = conn.BeginTransaction();

    // now do stuff within the transaction scope

    transaction.Commit();
}


但是,建议您使用TransactionScope,因为它更灵活,与平台无关,并且如果将来您确定确实需要使用MSDTC的功能时,它将使您更轻松。如果存在活动的TransactionScope,则EntityFramework将自动加入事务中:

using(TransactionScope transaction = new TransactionScope())
using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();

    // now do stuff within the transaction scope

    transaction.Complete();
}

10-06 05:59