在SQL Server 2005中捕获错误266

时间:2010-11-02 23:41:33

标签: sql-server sql-server-2005 jdbc transactions

有没有办法通过以某种方式包装exec语句来在JDBC或SQL内部捕获error 266

我们正在寻求围绕存储过程开发一个保护措施,以一种常见的方式保持事务处理。这有助于防止在与连接池结合时可能导致严重问题的程序员错误。

2 个答案:

答案 0 :(得分:3)

是。使用SET XACT_ABORT ON.

它可以抑制错误266并在任何情况下强制回滚,包括客户端命令超时,这只是一个中止。

这与PerformanceDBA提出的几点有效。

其他链接:

答案 1 :(得分:1)

  1. 编号较低的错误,15000及以下的IIRC,以及较高的严重性级别,中断执行。这意味着整个线程被中断,不可能将其捕获到存储的proc代码中。

  2. 无论如何,错误超出了SQL代码或存储过程的控制范围。较低编号的错误是“硬”错误,即使您确实陷阱,也无法对此做任何事情。它位于服务器(不是您的)域中。例如。硬盘错误; 1205.服务器决定,线程无法继续,并终止spid。

  3. 陷入您未管理,设置或控制的外部错误域是不可行的。所以我无法理解你期望的基础。 trapa(例如)硬件错误和死锁的唯一方法就是编写自己的服务器。

  4. 但最重要的是这个。通过在交易开放时处理用户交互,您违反了交易控制的基本法则(在您的权力范围内)。规则(40年不变)是:

    • 执行与无交易打开
    • 的所有用户互动
    • 完成后,终止进一步的用户互动
    • 开始交易,
    • 执行所有DML和
    • 提交
  5. 不遵守这些规则会导致容易出现的各种问题(遵守规则):

    • 不受控制的锁定时间
    • 挂起交易(等待已经去过午餐的用户)
    • 响应非常慢,服务器空闲,等待锁定 。
      如果你正在开车,当然,你可以在郊区的街道和商场里乱搞,但是一旦你得到一条高速公路,你就不能开车超过限速;你无法停下来等待乘客。如果你这样做,你会把所有人都挂起来。试图抓住导致警察赶到你身边的手机通话,或者试图阻止警察将你拖走,很可能会超出你的能力范围,尽管它们可能很强大。
  6. 在正常情况下,当服务器遇到硬错误并取消您的spid(当然包括回滚)时,问题将被关闭。符合ANSI SQL 89(早于92)的行为。交易是Atomic和Durable。现在,如果你不为该模型编写代码(提供隔离和一致性),它不是“事务”,它只是一串跨时空分布的不受控制的SQL,易于中断;脆弱而脆弱。

    显然,这意味着 NO AUTOCOMMIT和 NO CHAINED,因为它违反了ANSI SQL标准。 (a)MS提供如此恶劣的特征,并且(b)人们使用它,而不了解危险和违规情况,这是非常可悲的。

  7. 不要因为你认为服务器应该和不应该做什么而感到沮丧(这是徒劳的,因为它不会改变),我建议你对你生成的代码负责,并教育自己在设计和编写任何代码之前,了解服务器的实际工作方式,实际工作情况。

  8. 提出你的条款哦,它肯定会执行 try / catch / finally ,它捕获的一半错误导致它让你失望,所以你的 try / catch永远不会执行。 您的 SQL代码尝试最终的概念不存在。 SQL是一种高级数据库操作语言,而不是可以控制硬件资源的低级语言。

    如果你正在高速公路上驾驶汽车,你不能陷入(a)在你面前十公里处坠毁的桥梁或(b)警察在你面前一公里关闭高速公路

    试图控制无法控制的当然是......