Почему транзакция SQL не откатывается? - PullRequest
0 голосов
/ 06 марта 2012

Вот скрипт с вычеркнутыми ненужными частями

USE databaseName

BEGIN TRY 
    DECLARE @count INT 
    DECLARE @ErrorMsg VARCHAR(MAX) 

    SET @count=(SELECT COUNT(*) 
                FROM   xxxtable 
                WHERE  xxxcolumn = 'xxx') 

    IF( @count = 0 ) --This means that the script has not been run yet      
      BEGIN 
          BEGIN TRANSACTION 

          --do work in here 
          COMMIT TRANSACTION 
      END 
    ELSE 
      BEGIN 
          SELECT 'This script has already been run before. Cannot run it again.' 
      END 
END TRY 

BEGIN CATCH 
    IF( Xact_state() <> 0 ) 
      BEGIN 
          ROLLBACK TRAN 

          PRINT( 'ROLLED BACK TRANSACTION' ) 

          SELECT Error_number()  AS error_number, 
                 Error_line()    AS error_line, 
                 Error_message() AS error_message 
      END 
END CATCH 

Когда скрипт завершается ошибкой, он входит в блок catch и печатает ROLLED BACK TRANSACTION, а также отображает результаты оператора select (сообщение об ошибке и т. Д.).

Но когда я проверяю базу данных, данные до момента сбоя фиксируются. Что я тут не так делаю?

Обновление: После отката данных изменяется последнее доступное значение идентификатора. (Предположим, самое высокое доступное значение - 10, если я вставляю и выполняю откат, самое высокое доступное значение - 11, а не 10 больше). Таким образом, откат не возвращает базу данных в состояние до транзакции. Это то, что вызывало проблемы.

1 Ответ

1 голос
/ 06 марта 2012

Исходя из вашего обновления re: IDENTITY, это ожидаемое поведение.Откат не приведет к сбросу значения IDENTITY обратно, поэтому он создаст пробелы в ваших значениях ID.

Предположительно, это то, что вы имеете в виду, когда говорите «данные до момента отказа» - и не что все данные, которые вы обновили / вставили в транзакцию, все еще там после предполагаемого отката.

...