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