我正在创建一个存储过程,发现我的方法与同事的方法有些不同。
我正在使用 SQL Server 2005
。
My Stored procedure looks like this
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
And my colleague's way of writing looks like the below one
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
的位置。根据我的理解,我同事的方法在出现异常时不应该起作用,即因为方法2中TRAN没有作用域,所以Rollback
不应该被执行。但是当我尝试运行这两种方法时,它们以相同的方式工作。在方法1中,TRAN的作用域在try块之外,因此应在try块和catch块中可见,并且应根据编程的作用域方法给出结果。
在方法2中,TRAN的作用域在Try块中受限,因此
Commit
和Rollback
应在try块内发生,并且应在没有Begin Tran
存在于catch块中的Rollback
时引发异常,但这也完美地工作。我对TRANSACTION如何工作感到困惑。它是否无作用域?