代码之家  ›  专栏  ›  技术社区  ›  Scott Markwell

在SQL Server 2005中捕获错误266

  •  3
  • Scott Markwell  · 技术社区  · 14 年前

    有办法吗 error 266 在JDBC内部还是在SQL内部通过某种方式包装exec语句?

    我们希望开发一种防范存储过程以一种常见的方式退出时事务保持打开状态的方法。这有助于防止程序员错误,当与连接池结合使用时,这些错误可能会导致重大问题。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    8 年前

    对。使用 SET XACT_ABORT ON.

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

    这与PerformanceDBA的观点是分开的,PerformanceDBA的观点基本上是有效的。

    其他链接:

        2
  •  1
  •   PerformanceDBA    14 年前
    1. 编号较低的错误(15000及以下IIRC)和严重级别较高的错误会中断执行。这意味着整个线程被中断,不可能将其困在存储的过程代码中。

    2. 不管怎样,这些错误超出了SQL代码或存储过程的控制。编号较低的错误是“硬”错误,您对此无能为力,即使您捕获了它。它在服务器(不是您的)域中。硬盘错误;1205。服务器决定线程不能继续,并终止spid。

    3. 要捕获您没有管理、设置或控制的外部错误域是不可行的。所以我不能理解你期望你能做到的基础。解决trapa(eg)硬件错误和死锁的唯一方法是编写自己的服务器。

    4. 但最重要的是这个。通过处理用户交互,您正在打破事务控制的基本法则(这在您的权限范围内) . 规则(40年不变)是:

      • 没有未结交易
      • 终止进一步的用户交互
      • 开始交易,

      • .
    5. 不遵守这些规则将导致各种容易预防的问题(通过遵守规则):

      • 挂起的事务(等待去吃午饭的用户)
      • 响应非常慢,服务器处于空闲状态,等待锁定
        .
        如果你开车,当然,你可以在郊区街道和购物中心闲逛,但是一旦你在高速公路上找到一辆车,你就不能低于限速;你不能停下来等乘客。如果你这样做了,你会把所有人都挂了。试图截住会引起警察追杀你的手机,或者试图阻止警察拖你走,是很好的,有点超出你的能力,尽管他们可能是强大的。
        .
    6. 显然这意味着 因为它违反了ansisql标准。令人遗憾的是,(a)多发性硬化症提供了这样一个病态的特征,(b)人们使用它,却不了解其危险性和不合规性。

    7. 用你的话来说,哦,它肯定能发挥作用 尝试/抓住/最后 你的 try/catch永远无法执行。概念 你的 SQL代码正在尝试 最后

      试图控制无法控制的东西当然是。。。