我想确认实体框架的 ObjectContext.Connection.BeginTransaction() 方法返回的事务是否使用 MSDTC(Microsoft 分布式事务协调器)的支持?
有没有办法在不支持 MSDTC 的情况下使用事务?
我想确认实体框架的 ObjectContext.Connection.BeginTransaction() 方法返回的事务是否使用 MSDTC(Microsoft 分布式事务协调器)的支持?
有没有办法在不支持 MSDTC 的情况下使用事务?
它会在特定条件下自动提升为由 MSDTC 协调的事务。每次调用时,ObjectContext.SaveChanges()
如果范围内还没有一个新事务,则会创建一个新事务(如果范围内已经有一个活动事务,它将加入该事务)。但是,默认情况下,每次调用时连接也会打开和关闭ObjectContext.SaveChanges()
。因此,如果您在ObjectContext.Connection.BeginTransaction()
方法的开头调用,则调用ObjectContext.SaveChanges()
多次保持原始事务,使用某些版本的 SQL Server 和实体框架,这可能导致事务被提升为 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();
}