TransactionScope в приложении .NET - PullRequest
       12

TransactionScope в приложении .NET

2 голосов
/ 31 августа 2009

Я написал блок кода для выполнения транзакции базы данных в базе данных SQL Server. Я использую класс TransactionScope для отката всех изменений, если возникнут сбои во время выполнения. Если я запускаю приложение в системе, в которой работает SQL SERVER, у меня нет проблем. Если я запускаю приложение в системе, а SQL SERVER работает в другой системе, я получаю сообщение об ошибке: MSDTC отключен.

Если я включаю MSDTC в работающей системе DBServer, мое приложение работает нормально.

Если мне потребуется пользователь ORACLE db, как система будет работать? Должен ли я что-то настроить на сервере БД ORACLE, чтобы включить область транзакции? Пожалуйста, помогите мне.

Спасибо, P.Gopalakrishnan.

Ответы [ 2 ]

1 голос
/ 31 августа 2009

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, но это не очень проблематично.

0 голосов
/ 29 сентября 2009

TransactionScope поддерживает (гибридные) быстрые локальные транзакции с возможностью при необходимости перевести их в более дорогие распределенные транзакции. Для распределенных транзакций требуется MSDTC.

Причиной продвижения в распределенные транзакции является наличие второй базы данных в том же TransactionScope.

Поставщик данных Oracle версии 10.2.0.3 и выше поддерживает локальные транзакции + распределенные транзакции (так же, как для SQL Server 2005 и выше). Более старые версии ODP.NET поддерживают только распределенные транзакции.

...