如果您不在交易中,SET XACT_ABORT ON是否会在存储过程中执行任何操作?
我问,因为我的存储过程似乎以某种方式回滚了一个insert语句,即使存储过程中失败的部分不在事务中。正在向上推送表的标识,但在存储过程返回后插入的行不存在,尽管插入是无条件的而不是在事务内。
或者SQL Server是否会在事务外回滚插件还有其他原因吗?
答案 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
。