TransactionScope можно использовать для SQL-операций, он делает то же самое, что и Sqltransaction? - PullRequest
0 голосов
/ 31 мая 2010

я могу сделать что-то вроде этого:

using (var scope = new TransactionScope())
            {
                using (var conn = new SqlConnection(Cs))
                {
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                       ...
                        scope.complete();

                    }
                }
            }

будет таким же, как использование SqlTransaction с catch(){rollback;}

1 Ответ

2 голосов
/ 31 мая 2010

TransactionScope создает implicit transaction, поэтому любое действие в области транзакции, поддерживающее обработку транзакций, будет обрабатываться соответствующим Менеджером транзакций.

В случае обработки базы данных будет использоваться SqlTransaction. Так что да, ваш код будет делать то же самое, что и вручную, используя SqlTransaction.


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

Обратите внимание, что один объект TransactionScope может иметь один неявный тип транзакции, поэтому вам потребуется вложить объекты TransactionScope, чтобы обеспечить обработку транзакций несколькими менеджерами. F.e.:

using(var ts = new TransactionScope)
{
      using(var db = new TransactionScope)
      {
         //do db processing
      }
      using(var msmq = new TransactionScope)
      {
         //do msmq processing
      }
      ts.Complete();
}
...