TransactionScope, хотя и концептуально прост, скрывает много магии за кулисами. Это позволяет вам использовать одну транзакцию, которая распределена по нескольким машинам. Для этого ему требуется комплексная поддержка со стороны базы данных - и накладные расходы могут быть или не быть высокими.
Вам может подойти более простая, более ограниченная технология: DbTransaction. Ваш провайдер базы данных может реализовать транзакцию с семантикой, аналогичной BEGIN TRANSACTION
и COMMIT TRANSACTION
в sql: короче говоря, транзакция, охватывающая только одно соединение на одном компьютере.
Ваш код будет выглядеть примерно так ...
DbCommand cmd = ...;
using (DbTransaction trans = Connection.BeginTransaction()) {
cmd.Transaction = trans; //sometimes optional, though MS-SQL requires it.
cmd.ExecuteNonQuery()
[...other db commands with the same connection and transaction...]
trans.Commit();
}
Чтобы быть кристально чистым: вы можете использовать несколько других соединений, когда транзакция открыта, но между ними нет никакой связи. Команды, выполняемые для разных соединений, не отменяются при отмене транзакции (так же, как произвольный код C # не будет отменен при отмене транзакции).
Этот подход является более легким, более детализированным и работает для более широкого круга поставщиков баз данных, и для его загрузки не требуется MSDTC. С другой стороны, транзакции зависят от соединения (если у вас есть несколько соединений, они не разделяют транзакцию), они не могут быть распределены, и вам нужно будет вручную вводить команды в транзакцию (по крайней мере, для MS -SQL). * * 1012
Обратите внимание: если вам не удастся включить команду в транзакцию, MS-SQL выдаст исключение, тем не менее SQLite неявно зарегистрирует команду, и я не уверен, что делает oracle. Так как все команды должны быть зачислены в транзакции в любом случае, это просто избыточно избыточный API, но это не очень проблематично.