首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server -事务在错误时回滚?

SQL Server -事务在错误时回滚?
EN

Stack Overflow用户
提问于 2009-11-17 23:38:13
回答 3查看 233.9K关注 0票数 219

我们的客户端应用程序在SQL Server 2005上运行一些SQL,如下所示:

代码语言:javascript
复制
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对任何语言都应该有相同的响应。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-17 23:47:01

您可以将sql放在事务之前,以确保set xact_abort on在出错时自动回滚。

票数 228
EN

Stack Overflow用户

发布于 2009-11-17 23:46:11

您说得对,整个事务将被回滚。您应该发出命令回滚它。

您可以将其包装在TRY CATCH块中,如下所示

代码语言:javascript
复制
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

    -- <EDIT>: From SQL2008 on, you must raise error messages as follows:
    DECLARE @ErrorMessage NVARCHAR(4000);  
    DECLARE @ErrorSeverity INT;  
    DECLARE @ErrorState INT;  

    SELECT   
       @ErrorMessage = ERROR_MESSAGE(),  
       @ErrorSeverity = ERROR_SEVERITY(),  
       @ErrorState = ERROR_STATE();  

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);  
    -- </EDIT>
END CATCH
票数 224
EN

Stack Overflow用户

发布于 2017-04-27 13:04:54

下面是使用MSSQL Server 2016获取错误消息的代码:

代码语言:javascript
复制
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
票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1749719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档