Я создавал хранимую процедуру и вижу некоторые различия между моей методологией и методикой моего коллеги.
Я использую SQL Server 2005
Моя сохраненная процедура выглядит следующим образом
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>
И способ написания моего коллеги выглядит следующим образом
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
, но тоже отлично работает.
Я не понимаю, как работает СДЕЛКА. Это без области?