Какая транзакция лучше с Dapper: BEGIN TRAN или TransactionScope?

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

Когда я пишу SQL, я предпочитаю использовать транзакцию уже в скрипте с:

BEGIN TRAN

-- insert, update etc.

COMMIT

потому что это проще проверить, но есть также вопрос транзакции с dapper dot net, где используются.net транзакции, так что теперь я не уверен, какой из них мне следует использовать.

Есть ли у одного метода какие-либо недостатки / преимущества по сравнению с другим?

1 ответ

Решение

На самом деле, это не имеет ничего общего с Dapper. Послать этот ответ.

TransactionScope или же connection.BeginTransaction или решение "Транзакция в хранимой процедуре" выходит за рамки Dapper. Dapper просто выставляет несколько методов расширения DBConnection Объект ADO.NET отображает вывод запросов на объект. Отдых зависит от вас.

  1. TransactionScope обычно используется для распределенных транзакций; транзакции, охватывающие разные базы данных, могут находиться в разных системах. Для этого нужны некоторые конфигурации в операционной системе и SQL Server, без которых это не будет работать. Это не рекомендуется, если все ваши запросы относятся к одному экземпляру базы данных.
    Как отметил @ImrePühvel в комментариях: с одной базой данных это может быть полезно, когда вам нужно включить код в транзакцию, которая не находится под вашим контролем. С единой базой данных она также не требует специальных настроек.

  2. connection.BeginTransaction является синтаксисом ADO.NET для реализации транзакции (в C#, VB.NET и т. д.) для одной базы данных. Это не работает в нескольких базах данных.

  3. "Транзакция в хранимой процедуре" реализована для одной базы данных в хранимой процедуре, а не в коде приложения.

Вложенные транзакции или комбинация вышеперечисленных типов - еще одна тема для обсуждения; попробуйте поискать сеть для этого.

Мое личное мнение - использовать UnitOfWork для лучшей обработки транзакций. Я уже упоминал подробности в ссылке выше. Оно использует connection.BeginTransaction внутренне.

Другие вопросы по тегам