当commit tran语句

时间:2016-06-03 13:07:18

标签: sql sql-server tsql transactions

我正在使用后端使用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

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

根据这个问题Can a COMMIT statement (in SQL) ever fail? How?,commit tran可能会失败,但是我必须回滚它,因为事务尚未成功提交。当连接关闭时,SQL服务器会自动回滚吗?

请指出MSDN中的文档或您获取信息的任何地方。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我使用交易的方式:

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

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

答案 2 :(得分:0)

在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

答案 3 :(得分:-1)

你可以像下面这样使用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