我正在创建一个存储过程,我发现我的方法与我的同事之间存在一些差异。
我正在使用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
我同事的写作方式如下所示
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的范围在try块之外,因此它应该在try块和catch块中都可见,并且应该根据编程工作的范围方法给出结果。
在方法2中,TRAN的范围在Try块中受限,因此Commit
和Rollback
应该出现在try块中,并且当Rollback
没有{{1}时应该抛出异常存在于catch块中,但这也很有效。
我对TRANSACTION如何运作感到困惑。它没有范围吗?
答案 0 :(得分:10)
交易不像编程语言那样“作用域”。
为当前连接嵌套事务。每个BEGIN TRAN都会启动一个新事务,每当调用COMMIT或ROLLBACK时,此事务就会结束,这与存储过程中的位置无关。
答案 1 :(得分:2)
交易是嵌套的 目前的联系。每个BEGIN TRAN 开始一个新的交易,这个 只要COMMIT或者,事务就会结束 ROLLBACK被调用,没关系 在你的存储过程中,这是。
仅添加ROLLBACK结束连接的“全部”打开事务...