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

我们有在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对任何语言都应做出相同的响应。


沧海一幻觉
浏览 1015回答 3
3回答

一只名叫tom的猫

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

狐的传说

您是正确的,因为整个事务都会回滚。您应该发出命令以将其回滚。您可以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 TRYBEGIN 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

料青山看我应如是

这是获取与错误消息一起使用MSSQL Server 2016的代码:BEGIN TRY    BEGIN TRANSACTION         -- Do your stuff that might fail here    COMMITEND TRYBEGIN 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
打开App,查看更多内容
随时随地看视频慕课网APP