我们的客户端应用程序在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对任何语言都应该有相同的响应。
发布于 2009-11-17 23:47:01
您可以将sql放在事务之前,以确保set xact_abort on
在出错时自动回滚。
发布于 2009-11-17 23:46:11
您说得对,整个事务将被回滚。您应该发出命令回滚它。
您可以将其包装在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
-- <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
发布于 2017-04-27 13:04:54
下面是使用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
https://stackoverflow.com/questions/1749719
复制相似问题