Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否需要回滚事务?_Sql Server_Transactions - Fatal编程技术网

Sql server 是否需要回滚事务?

Sql server 是否需要回滚事务?,sql-server,transactions,Sql Server,Transactions,如果第一个delete语句失败,会发生什么情况?是否执行第2条和第3条delete语句?该示例没有任何错误处理,在出现异常的情况下,它会保留一个打开的事务,还是SQL Server会自动回滚该事务?打开事务=锁定资源,对吗 我正在决定是否必须对使用事务的存储过程应用TRY…CATCH 我知道设置xact\u abort on,但想知道没有它会发生什么 以下是我在文档中发现的内容-控制事务(数据库引擎): 如果错误阻止事务成功完成,SQL Server将自动回滚事务并释放事务所持有的所有资源 但是

如果第一个delete语句失败,会发生什么情况?是否执行第2条和第3条delete语句?该示例没有任何错误处理,在出现异常的情况下,它会保留一个打开的事务,还是SQL Server会自动回滚该事务?打开事务=锁定资源,对吗

我正在决定是否必须对使用事务的存储过程应用TRY…CATCH

我知道
设置xact\u abort on
,但想知道没有它会发生什么

以下是我在文档中发现的内容-控制事务(数据库引擎):

如果错误阻止事务成功完成,SQL Server将自动回滚事务并释放事务所持有的所有资源


但是,我在其他帖子中读到,自动回滚没有触发。

我更喜欢手动控制流程:

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

在您的示例中,如果不使用
SET XACT_ABORT ON
,即使第一条语句失败,事务仍将继续并提交。在您引用的文本中,如果错误**阻止**成功完成交易,则关键字为
,而
删除
语句失败不会阻止交易完成

一个导致自动回滚的错误的例子是,在事务的中间切断了与数据库的连接。再往下看,你提到的是:

如果发生运行时语句错误(例如约束冲突) 在批处理中,数据库引擎中的默认行为是滚动 仅返回生成错误的语句。你可以改变这个 使用SET XACT_ABORT语句的行为。将XACT_中止设置为ON后 执行时,任何运行时语句错误都会导致自动回滚 当前事务的。编译错误(如语法错误)是 不受SET XACT_中止的影响


使用错误处理捕获错误并在需要时回滚始终是一个好主意。

因此它将回滚失败的第一条delete语句,然后开始执行第二条语句,然后以相同的方式执行第三条语句?最后会去提交声明吗?这意味着单个语句中的错误不会停止批处理执行,对吗?没错。此外,我更新了我的答案(希望)更清楚一点:)
BEGIN TRY
BEGIN TRAN

   -- do work

COMMIT
END TRY
BEGIN CATCH
    ROLLBACK
    RAISERROR (...)
END CATCH
GO