如果事务由SET XACT_ABORT ON终止,则设置XACT_ABORT OFF

时间:2015-09-22 14:53:33

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

我读到许多人在程序开始时倾向于{{#link-to 'accounts.devices' tagName='li' disabled=true class='dropdown'}} <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Devices<span class="caret"></span></a> <ul class="dropdown-menu"> {{#link-to 'accounts.devices.devices1' tagName='li'}}<a href={{view.href}}>Devices 1</a>{{/link-to}} {{#link-to 'accounts.devices.devices2' tagName='li'}}<a href={{view.href}}>Devices 2</a>{{/link-to}} </ul> {{/link-to}}

SET XACT_ABORT ON

由于运行时错误将终止该过程,CREATE PROC myProc AS Begin BEGIN TRAN SET XACT_ABORT ON [..code1 that might throw an error..] [..code2..] SET XACT_ABORT OFF [?] COMMIT TRAN END SET XACT_ABORT OFF [?] 将保留为SET XACT_ABORT。我有一些问题:

  1. 你在哪里设置它?在ON定义之前,CREATE PROC之后或BEGIN之后? BEGIN TRAN处于连接级别,所以我认为这三个都没有区别?

  2. 如果错误发生时,SET何时转为OFF

1 个答案:

答案 0 :(得分:1)

在CREATE PROC定义之前设置XACT_ABORT没有多大意义。与ANSI_NULLS或QUOTED_IDENTIFIER不同,此选项不存储为存储过程的属性。我会说你应该在CREATE PROC myProc AS之后或第一个BEGIN之后立即设置XACT_ABORT,你也可以在那里设置SET NOCOUNT。

我不打算关闭XACT_ABORT。如果任何代码部分需要关闭它(例如,在忽略某些错误的TRY-CATCH块内),它应该在特定的TRY块内设置它,并在END CATCH结束时重新设置它。

有关详细信息,请参阅:http://www.sommarskog.se/error_handling/Part1.html