加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Sql server中TRANSACTION的范围是什么

发布时间:2020-12-12 06:33:19 所属栏目:MsSql教程 来源:网络整理
导读:我正在创建一个存储过程,我发现我的方法和我的同事之间存在一些差异. 我正在使用SQL Server 2005 我的存储过程看起来像这样 BEGIN TRAN BEGIN TRY INSERT INTO Tags.tblTopic (Topic,TopicCode,Description) VALUES(@Topic,@TopicCode,@Description) 我的同事
我正在创建一个存储过程,我发现我的方法和我的同事之间存在一些差异.

我正在使用SQL Server 2005

>我的存储过程看起来像这样

BEGIN TRAN
    BEGIN TRY
        INSERT INTO Tags.tblTopic 
            (Topic,TopicCode,Description)
            VALUES(@Topic,@TopicCode,@Description)


>我的同事的写作方式如下所示

BEGIN TRY
    BEGIN TRAN
        INSERT INTO Tags.tblTopic 
            (Topic,@Description)


这里两种方法的唯一区别是Begin TRAN的位置.
根据我的说法,我的同事的方法在发生异常时不应该工作,即回滚不应该执行,因为TRAN在方法2中没有范围.但是当我尝试运行这两种方法时,它们的工作方式相同.

在方法1中,TRAN的范围在try块之外,因此它应该在try块和catch块中都可见,并且应该根据编程工作的范围方法给出结果.

在方法2中,TRAN的范围限制在Try块中,因此Commit和Rollback应该在try块中发生,并且当catch块中存在没有Begin Tran的Rollback时应该抛出异常,但这也是完美的.

我对TRANSACTION如何运作感到困惑.它没有范围吗?

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 CATCHINSERT INTO Tags.tblSubjectTopic (SubjectId,@@IDENTITY) COMMIT TRAN END TRY BEGIN CATCH DECLARE @Error VARCHAR(1000) SET @Error= 'ERROR NO : '+ERROR_NUMBER() + ',ERROR MESSAGE : '+ERROR_MESSAGE() PRINT @Error ROLLBACK TRAN END CATCH

解决方法

事务不像编程语言那样“作用域”.

事务是针对当前连接嵌套的.每个BEGIN TRAN都会启动一个新事务,每当调用COMMIT或ROLLBACK时,此事务就会结束??,这与存储过程中的位置无关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读