gpt4 book ai didi

entity-framework - ObjectContext.Connection.BeginTransaction() 是否使用 MSDTC?

转载 作者:行者123 更新时间:2023-12-04 08:35:23 25 4
gpt4 key购买 nike

我想确认Entity Framework的ObjectContext.Connection.BeginTransaction()方法返回的Transaction是否使用了MSDTC(Microsoft Distributed Transaction Coordinator)的支持?

有没有不支持 MSDTC 的情况下使用事务的方法?

最佳答案

它会在特定条件下自动提升为由 MSDTC 协调的事务。每次您调用 ObjectContext.SaveChanges() 时,如果范围内还没有一个新事务,就会创建一个新事务(如果范围内已经有一个事件事务,它将在该事务中登记)。但是,默认情况下,连接也会在您每次调用 ObjectContext.SaveChanges() 时打开和关闭。因此,如果您在方法开始时调用 ObjectContext.Connection.BeginTransaction(),然后在保留原始事务的同时多次调用 ObjectContext.SaveChanges(),对于某些版本的 SQL Server 和 Entity Framework ,这可能会导致事务被提升为 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();
}

关于entity-framework - ObjectContext.Connection.BeginTransaction() 是否使用 MSDTC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6857657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com