TransactionScope транзакция = новый TransactionScope () VS TransactionScope s = context.Connection.BeginTransaction () - PullRequest
0 голосов
/ 07 января 2020

Я просто хочу знать, хочу ли я откатить все изменения в базе данных, если транзакция не завершена, есть ли разница между

 using (TransactionScope transaction = new TransactionScope())

и

using (var dbContextTransaction = context.Database.BeginTransaction())

I я запутался, когда прочитал эти два:

Connection.BeginTransaction и Entity Framework 4?

и

https://docs.microsoft.com/en-us/ef/ef6/saving/transactions

** обратите внимание, что я использую Entity Framework 4 в моем проекте, если это необходимо

Ответы [ 3 ]

1 голос
/ 07 января 2020

Есть две ловушки с TransactionScope, о которых вы должны знать.

Во-первых, по умолчанию будет создана транзакция с уровнем изоляции SERIALIZABLE, что для SQL Server является плохим выбором. , Поэтому вы всегда должны создавать свой TransactionScope следующим образом:

public class TransactionUtils 
{
  public static TransactionScope CreateTransactionScope()
  {
    var transactionOptions = new TransactionOptions();
    transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
    transactionOptions.Timeout = TransactionManager.MaximumTimeout;
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
  }
}

См. Здесь напыщенную речь: использование нового TransactionScope () считается вредным

Во-вторых, TransactionScope поддерживает распределенные транзакции , Таким образом, вы сможете подключить разных соединений и даже разных поставщиков ресурсов в одной транзакции. Хотя это иногда полезно, это чаще ловушка. Если вы случайно получите распределенную транзакцию, вы можете случайно получить зависимость от наличия координатора распределенных транзакций в вашей среде. Поэтому вам следует предпринять шаги, чтобы избежать распределенной транзакции, например, отключить координатор распределенных транзакций Microsoft (MSDT C) в вашей среде разработки. И убедитесь, что каждый раз, когда в транзакцию зачисляется несколько методов, они не открывают SqlConnection одновременно.

1 голос
/ 21 января 2020

Пока База данных. BeginTransaction () используется только для транзакций, связанных с базой данных, System. Сделки. ... TransactionScope для смешивания операций дБ и C# кода вместе в транзакции.

см. Ниже ссылки. Надеюсь, они вам помогут:

TransactionScope против транзакции в LINQ для SQL

Database.BeginTransaction против транзакций.TransactionScope

1 голос
/ 07 января 2020

С Программирование Microsoft SQL Сервер 2012 :

Существует ряд болевых точек с явными транзакциями. Первая трудность заключается в том, что каждому объекту SqlCommand, используемому для выполнения обновлений внутри транзакции, должно быть присвоено свойство Transaction для объекта SqlTransaction, возвращаемого BeginTransaction. Это означает, что вы должны позаботиться о том, чтобы передать объект SqlTransaction в любое место в вашем коде, в котором выполняется обновление, поскольку неудача при назначении его свойству Transaction каждого объекта SqlCommand в транзакции приводит к времени выполнения исключение. Проблема усугубляется, когда вам нужно отслеживать объект SqlTransaction по нескольким вызовам методов, которые выполняют обновления. Управлять вещами становится еще сложнее, когда эти методы должны быть достаточно гибкими, чтобы работать независимо от того, участвует транзакция или нет.

Проблема усугубляется при работе с любой из других технологий, которые мы рассмотрим. позже это обеспечивает слои абстракции над необработанными объектами. Например, поскольку SqlDataAdapter фактически оборачивает три отдельных объекта SqlCommand (для вставки, обновления и удаления), вы должны копаться под адаптером данных и подключаться к его трем базовым объектам команд, чтобы вы могли установить их Transaction свойства. (Как правило, мы не рекомендуем смешивать и сопоставлять разные API доступа к данным в вашем приложении, но если вам необходимо выполнить транзакции для обновлений в сочетании технологий, неявные транзакции облегчают это.)

Объект TransactionScope , представленный как часть специального API управления транзакциями с. NET 2.0 в 2005 году, позволяет неявно кодировать транзакции. Это превосходный подход, который освобождает вас от всех вышеупомянутых проблем, связанных с явными транзакциями. Таким образом, руководство здесь всегда должно работать с неявными транзакциями, когда это возможно. Вы будете писать меньше кода, который будет более гибким, если вы позволите инфраструктуре обрабатывать управление транзакциями для вас. Однако все еще важно понимать явные транзакции с объектом SqlTransaction, так как вам может потребоваться интеграция и расширение существующего кода, который уже использует явные транзакции. Поэтому мы рассмотрим оба стиля управления транзакциями, чтобы подготовить вас к любым ситуациям.

API управления транзакциями предлагает множество других преимуществ, помимо неявных транзакций. Например, TransactionScope может автоматически преобразовывать облегченную транзакцию (одну, связанную с одной базой данных) в распределенную транзакцию, если и когда ваши обновления связаны с изменениями в нескольких базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...