Каков объем ТРАНЗАКЦИИ в SQL-сервере

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

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

  1. Моя Хранимая процедура похожа на это

    BEGIN TRAN
        BEGIN TRY
            INSERT INTO Tags.tblTopic 
                (Topic, TopicCode, Description)
                VALUES(@Topic, @TopicCode, @Description)
    
    
            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
    
  2. И способ моего коллеги записать похож ниже одного

    BEGIN TRY
        BEGIN TRAN
            INSERT INTO Tags.tblTopic 
                (Topic, TopicCode, Description)
                VALUES(@Topic, @TopicCode, @Description)
    
    
            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
    

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

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

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

Я смущен тем, как ТРАНЗАКЦИЯ работает. Действительно ли это без объемов?

8
задан Chait 18 January 2013 в 17:41
поделиться

2 ответа

Транзакции не "скопированы" так, как это делают языки программирования.

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

10
ответ дан 5 December 2019 в 14:02
поделиться

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

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

2
ответ дан 5 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: