繁体   English   中英

在commit tran语句中事务失败时,SQL Server中是否需要回滚

[英]Is rollback required in SQL Server when transaction failed in commit tran statement

我正在使用后端使用SQL Server 2014的一些现有应用程序中工作。 我发现提交事务的模式就像

USE AdventureWorks;
GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 10;
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 11;
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 12;
GO
COMMIT TRANSACTION;
GO

我想知道在提交事务语句中查询是否失败 ,我是否需要在那里使用回滚语句?

根据这个问题, COMMIT语句(在SQL中)是否会失败? 怎么样? ,commit tran可能会失败,但是由于事务尚未成功提交,我是否必须将其回滚。 当连接关闭时,SQL服务器会自动回滚吗?

请指出MSDN中的文档或您获取信息的位置。

我相信在连接关闭后它会。 您不应指望这一点,需要考虑许多因素,包括连接池。 我建议您查看SET XACT_ABORT ON和/或使用try catch块。

我使用交易的方式:

Begin Try
    Begin Tran
    -- do some work here...
    Commit Tran
End Try

Begin Catch
    If ( @@TranCount > 0 )
        Rollback Tran
End Catch

在try / catch中执行事务提交/回滚可能是最佳实践。

但是,如果您希望代码自动回滚事务中的所有语句,则需要在begin trans语句之前的某处添加“set xact_abort on”语句。 如果任何语句失败,xact_abort会自动回滚事务中的所有语句。 要了解xact_abort的效果,请执行以下代码。 打开和关闭xact_abort并观察表的内容。 由于主键违规,样本中批处理的第一个语句将始终失败。

use tempdb 
go 
if exists (select * from sys.tables where name='t') drop table t 
go 
create table t (id int not null primary key) 
go 
insert t values(1) 
go
set xact_abort on 
begin transaction 
 insert t values(1) 
 insert t values(2) 
commit transaction 
go 
select * from t

您可以使用try ... catch,如下所示。

BEGIN TRY
    DELETE
    FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 10;

    DELETE
    FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 11;

    DELETE
    FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 12;

    COMMIT;
END TRY

BEGIN CATCH
    ROLLBACK

    SELECT Db_name()
        ,CONVERT(NVARCHAR(15), Error_number())
        ,CONVERT(NVARCHAR(10), Error_line())
        ,Error_message()
END CATCH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM