如果您不在事务中,SET XACT_ABORT ON是否在存储过程中执行任何操作?

时间:2013-08-08 09:23:45

标签: sql sql-server tsql stored-procedures transactions

如果您不在交易中,SET XACT_ABORT ON是否会在存储过程中执行任何操作?

我问,因为我的存储过程似乎以某种方式回滚了一个insert语句,即使存储过程中失败的部分不在事务中。正在向上推送表的标识,但在存储过程返回后插入的行不存在,尽管插入是无条件的而不是在事务内。

或者SQL Server是否会在事务外回滚插件还有其他原因吗?

1 个答案:

答案 0 :(得分:3)

SET XACT_ABORT ON更改了语句终止错误的行为,以便它们成为批量中止错误。执行过程的批处理在遇到错误时更有可能完全停止,而不是继续执行下一个T-SQL语句。

这对错误处理有影响。通常允许您通过程序中的IF @@ERROR <> 0块继续执行处理代码的语句终止错误将不会被执行。更糟糕的是,您无法在T-SQL代码中拦截批量中止,因此除非在同一连接上的下一批中立即检查@@ERROR,否则您可能不知道存在问题。

也许你的INSERT以某种方式悄然失败,仍允许IDENTITY种子递增。这并不罕见......身份值驻留在SQL Server内存缓存中,其波动性无法保证这些值是连续的且没有间隙。

或者,存储过程的调用上下文很重要。如果从外部作用域事务中调用(由SQL Server启动或在应用程序级别调用),则在该外部作用域的回滚将回滚内部作用域工作,而不管内部作用域中的显式事务处理代码。同样,IDENTITY种子会增加。

TRY/CATCH块(自SQL Server 2005起可用)无需SET XACT_ABORT ON