Почему Dapper нужна ссылка на транзакцию при выполнении запроса?

#c# #dapper

#c# #dapper

Вопрос:

Просто просматриваю это руководство: https://www.davepaquette.com/archive/2019/02/06/managing-transactions-in-dapper.aspx

Насколько я понимаю (без Dapper), как только у вас есть соединение, вы можете открыть транзакцию, затем выполнить кучу операторов, а затем либо зафиксировать, либо откатить транзакцию. Этим запросам не нужно ссылаться на транзакцию, потому что соединение уже «знает» об этом.

Итак, почему Dapper нужна транзакция каждый раз, когда выполняется какое-либо действие?

Комментарии:

1. Вы можете использовать явные транзакции, и это один из подходов. Использование неявных транзакций TransactionScope также работает и Dapper не требует в этом ничего особенного. learn.microsoft.com/en-us/dotnet/framework/data/transactions /…

2. @Dusan окружающие транзакции имеют «удобство» в столбце «плюс», но вносят ряд рисков и проблем в столбец «минус». Лично я бы с трудом рекомендовал их

Ответ №1:

Dapper ничего не меняет в фундаментальном ADO.NET модель, поэтому, если ваша операция внутри транзакции завершается неудачей, если вы явно не передаете транзакцию Dapper, то это ADO.NET вещь, и та же самая операция завершилась бы точно так же без Dapper. Все, что делает Dapper, это устанавливает Transaction свойство в команде.

Или, другими словами: я считаю, что ваше понимание здесь неверно. Я согласен с вами в том, что ваше понимание и ожидания разумны, и я не знаю ни одной веской причины, по которой команде вообще нужно знать о транзакции, что в конечном итоге связано с подключением. Но: я не устанавливаю правила :/

Обратите внимание, что можно использовать шаблон «декоратор» в ADO.NET (например, мини-профилировщик делает это), поэтому теоретически можно было бы создать оболочку соединения, которая отслеживает транзакцию для вас, и заставить команду извлекать транзакцию и автоматически присоединять ее при выполнении операций. Вероятно, это не составит большого труда, если вы начнете с базового типа mini-profiler.

Комментарии:

1. Ха-ха. Да, мое понимание было неверным. Полезно знать, что команда должна знать о транзакции. Я согласен, что это кажется странным.

2. @ChechyLevas Я добавил последний бит внизу, который может быть полезен