Использует ли ObjectContext.Connection.BeginTransaction () MSDTC? - PullRequest
3 голосов
/ 28 июля 2011

Я хочу подтвердить, использует ли Transaction, которую возвращает метод ObjectContext.Connection.BeginTransaction () Entity Framework, поддержку MSDTC (Microsoft Distributed Transaction Coordinator) или нет?

Можно ли использовать транзакции без поддержки MSDTC?

1 Ответ

5 голосов
/ 28 июля 2011

Он будет автоматически переведен на транзакцию, согласованную 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.EntityFramework автоматически подключится к транзакции, если есть активный TransactionScope:

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();
}
...