Каков объем транзакции на сервере SQL - PullRequest
8 голосов
/ 15 марта 2010

Я создавал хранимую процедуру и вижу некоторые различия между моей методологией и методикой моего коллеги.

Я использую SQL Server 2005

  1. Моя сохраненная процедура выглядит следующим образом

    BEGIN TRAN
        BEGIN TRY
            INSERT INTO Tags.tblTopic 
                (Topic, TopicCode, Description)
                VALUES(@Topic, @TopicCode, @Description)
    
    <pre><code>        INSERT INTO Tags.tblSubjectTopic
                (SubjectId, TopicId)
                VALUES(@SubjectId, @@IDENTITY)
          COMMIT TRAN
    END TRY
    
    BEGIN CATCH
            DECLARE @Error VARCHAR(1000)
            SET @Error= 'ERROR NO : '+ERROR_NUMBER() + ', LINE NO : '+ ERROR_LINE() + ', ERROR MESSAGE : '+ERROR_MESSAGE()
            PRINT @Error
            ROLLBACK TRAN
    END CATCH
    </code>
  2. И способ написания моего коллеги выглядит следующим образом

    BEGIN TRY
        BEGIN TRAN
            INSERT INTO Tags.tblTopic 
                (Topic, TopicCode, Description)
                VALUES(@Topic, @TopicCode, @Description)
    
    <pre><code>        INSERT INTO Tags.tblSubjectTopic
                (SubjectId, TopicId)
                VALUES(@SubjectId, @@IDENTITY)
       COMMIT TRAN
    END TRY
    
    BEGIN CATCH
            DECLARE @Error VARCHAR(1000)
            SET @Error= 'ERROR NO : '+ERROR_NUMBER() + ', LINE NO : '+ ERROR_LINE() + ', ERROR MESSAGE : '+ERROR_MESSAGE()
            PRINT @Error
            ROLLBACK TRAN
    END CATCH
    </code>

Здесь единственная разница между этими двумя методами - это позиция Begin TRAN. По моему мнению, метод моего коллеги не должен работать, когда возникает исключение, т.е. Rollback не должен выполняться, потому что TRAN не имеет области действия в методе 2. Но когда я попытался запустить оба метода, они работали одинаково.

В методе 1 область действия TRAN находится вне блока try, поэтому он должен быть виден как в блоке try, так и в блоке catch, и должен давать результат в соответствии с методологией области действия программ.

В методе 2 область действия TRAN ограничена в блоке Try, поэтому Commit и Rollback должны встречаться в блоке try и должны вызывать исключение, когда в блоке catch существует Rollback без Begin Tran, но тоже отлично работает.

Я не понимаю, как работает СДЕЛКА. Это без области?

Ответы [ 2 ]

10 голосов
/ 15 марта 2010

Транзакции не ограничены так, как языки программирования.

Транзакции вложены для текущего соединения. Каждый BEGIN TRAN начинает новую транзакцию, и эта транзакция заканчивается всякий раз, когда вызывается COMMIT или ROLLBACK, не имеет значения, где в вашем сохраненном процессе это.

2 голосов
/ 15 марта 2010

Транзакции вложены в текущее соединение. Каждый НАЧИНАЕТ ТРАН начинает новую транзакцию, и это транзакция заканчивается всякий раз, когда COMMIT или ROLLBACK называется, это не имеет значения где в вашем хранимом процессе это.

только чтобы добавить, что ROLLBACK завершает "все" открытые транзакции для соединения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...