我正在使用后端使用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中的文档或您获取信息的任何地方。
答案 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