Я создавал хранимую процедуру, и я вижу некоторые различия между своей методологией и мой коллега.
Я использую SQL Server 2005
Моя Хранимая процедура похожа на это
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
И способ моего коллеги записать похож ниже одного
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
существует в блоке выгоды, но это также работает отлично.
Я смущен тем, как ТРАНЗАКЦИЯ работает. Действительно ли это без объемов?
Транзакции не "скопированы" так, как это делают языки программирования.
Транзакции являются вложенными для текущего соединения. Каждый BEGIN TRAN начинает новую транзакцию, и эта транзакция заканчивается всякий раз, когда вызывается COMMIT или ROLLBACK, неважно, где в вашей хранимой процедуре это происходит.
Транзакции вложены для текущего соединения . Каждый BEGIN TRAN запускает новую транзакцию, и эта транзакция завершается всякий раз, когда вызывается COMMIT или ROLLBACK, не имеет значения , где в вашей сохраненной процедуре это .
только для того, чтобы добавить, что ROLLBACK завершает «все» открытые транзакции для соединения ...