我想确认实体框架的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();
}