Как использовать транзакции для нескольких хранимых процедур? - PullRequest
9 голосов
/ 24 января 2011

Можно ли запустить транзакцию в одной хранимой процедуре, а затем откатить ее или зафиксировать во вложенной процедуре?

Ответы [ 4 ]

10 голосов
/ 24 января 2011

Фиксация и откат имеют разные эффекты

  • Уменьшение COMMIT @@ TRANCOUNT
  • ROLLBACK возвращает его к нулю

Это происходит потому, что SQL Server делаетна самом деле не поддерживает вложенные транзакции.

Если вы фиксируете или откатываете во вложенном хранимом процессе (не транзакции), то сгенерируйте ошибку 266 из-за несоответствия @@ TRANCOUNT при запуске и вводе

Проблема отката может быть решена с помощью SET XACT_ABORT ON, который является «автоматическим откатом» (просто) и подавляет ошибку 266.

Проблема фиксации ... вы не можете как таковой.Тем не менее, вы можете контролировать, где это происходит, отмечая @@ TRANCOUNT в сохраненной записи процедуры и фиксируя только , если ноль.

Для правильной обработки транзакций, смотрите мои ответы здесь: Вложенохранимые процедуры, содержащие шаблон TRY CATCH ROLLBACK? и Должен ли я считать транзакции перед выполнением отката в блоке перехвата в T-SQL?

2 голосов
/ 24 января 2011

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

http://msdn.microsoft.com/en-us/library/ms188929(v=SQL.90).aspx

1 голос
/ 24 января 2011

Вы должны объединить ваши BEGIN TRAN и COMMIT в одном SPROC

Если затем вызвать другой SPROC, в котором также есть транзакция, последующие пары BEGIN TRAN / COMMIT TRAN будут увеличиваться и уменьшаться @@ Trancount соответственно.

Транзакция совершается на последнем COMMIT TRAN (@@ Trancount = 1)

Однако любой ROLLBACK всегда будет откатывать транзакцию.

MSDN имеет хорошее объяснение.

0 голосов
/ 12 сентября 2011

Да, это возможно.С такими языками программирования, как C #, когда вы передаете объект соединения и транзакции с помощью команды.если что-то поймано как неправильное, чем откат транзакции:

   string customerConnection = "Connection";
        string query = "insert into temp values ('Data2','data1','data2','data3')";
        string query2 = "update tempcst set data = 'Hello data'";

        SqlConnection myConnection = new SqlConnection(customerConnection);
        myConnection.Open();


        SqlTransaction myTrans = myConnection.BeginTransaction();

 Try{

        int result = executeNonQuery(query, myConnection, myTrans, "");
        i = executeNonQuery(query2, myConnection, myTrans, "");
   myTrans.Commit();}



  catch{
        myTrans.Rollback();
        myConnection.Close();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...