Sha*_*pta 8 sql t-sql database sql-server
我正在创建一个存储过程,我发现我的方法和我的同事之间存在一些差异.
我在用 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
Run Code Online (Sandbox Code Playgroud)
我的同事的写作方式如下所示
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
Run Code Online (Sandbox Code Playgroud)
这里两种方法的唯一区别是位置Begin TRAN.根据我的说法,我的同事的方法在发生异常时不应该工作,即Rollback不应该执行,因为TRAN在方法2中没有范围.但是当我尝试运行这两种方法时,它们的工作方式相同.
在方法1中,TRAN的范围在try块之外,因此它应该在try块和catch块中都可见,并且应该根据编程工作的范围方法给出结果.
在方法2,TRAN的范围try块中的限制所以Commit和Rollback应该在try块内发生,当一个应该抛出的异常Rollback没有Begin Tran在catch块存在,但是这也可以正常使用.
我对TRANSACTION如何运作感到困惑.它没有范围吗?
Rob*_*Day 10
事务不像编程语言那样"作用域".
事务是针对当前连接嵌套的.每个BEGIN TRAN都会启动一个新事务,每当调用COMMIT或ROLLBACK时,此事务就会结束,这与存储过程中的位置无关.
| 归档时间: |
|
| 查看次数: |
7678 次 |
| 最近记录: |