[英]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.