为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server-事务会因错误而回滚?

SQL Server-事务会因错误而回滚?

沧海一幻觉 2019-11-07 11:20:37
我们有在SQL Server 2005上运行某些SQL的客户端应用程序,如下所示:BEGIN TRAN;INSERT INTO myTable (myColumns ...) VALUES (myValues ...);INSERT INTO myTable (myColumns ...) VALUES (myValues ...);INSERT INTO myTable (myColumns ...) VALUES (myValues ...);COMMIT TRAN;它由一个长字符串命令发送。如果插入操作之一失败,或者命令的任何部分失败,SQL Server会回滚事务吗?如果不回滚,是否必须发送第二条命令来回滚?我可以提供有关正在使用的api和语言的详细信息,但我认为SQL Server对任何语言都应做出相同的响应。
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以将set xact_abort on事务放在事务之前,以确保sql在发生错误的情况下自动回滚。


查看完整回答
反对 回复 2019-11-07
?
狐的传说

TA贡献1804条经验 获得超3个赞

您是正确的,因为整个事务都会回滚。您应该发出命令以将其回滚。


您可以TRY CATCH按以下步骤将其包装


BEGIN TRY

    BEGIN TRANSACTION


        INSERT INTO myTable (myColumns ...) VALUES (myValues ...);

        INSERT INTO myTable (myColumns ...) VALUES (myValues ...);

        INSERT INTO myTable (myColumns ...) VALUES (myValues ...);


    COMMIT TRAN -- Transaction Success!

END TRY

BEGIN CATCH

    IF @@TRANCOUNT > 0

        ROLLBACK TRAN --RollBack in case of Error


    -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception

    RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)

END CATCH


查看完整回答
反对 回复 2019-11-07
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

这是获取与错误消息一起使用MSSQL Server 2016的代码:


BEGIN TRY

    BEGIN TRANSACTION 

        -- Do your stuff that might fail here

    COMMIT

END TRY

BEGIN CATCH

    IF @@TRANCOUNT > 0

        ROLLBACK TRAN


        DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE()

        DECLARE @ErrorSeverity INT = ERROR_SEVERITY()

        DECLARE @ErrorState INT = ERROR_STATE()


    -- Use RAISERROR inside the CATCH block to return error  

    -- information about the original error that caused  

    -- execution to jump to the CATCH block.  

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);

END CATCH


查看完整回答
反对 回复 2019-11-07
  • 3 回答
  • 0 关注
  • 1014 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信