Sql server SQL Server 2005中捕获错误266

Sql server SQL Server 2005中捕获错误266,sql-server,sql-server-2005,jdbc,transactions,Sql Server,Sql Server 2005,Jdbc,Transactions,在JDBC或SQL中是否有一种方法可以通过某种方式包装exec语句来防止陷阱 我们希望开发一种防范存储过程以一种常见的方式退出并保留打开的事务的方法。这有助于防止程序员错误,当与连接池结合使用时,程序员错误可能会导致重大问题 编号较低的错误(15000及以下IIRC)和较高的严重性级别会中断执行。这意味着整个线程被中断,不可能将其捕获到存储的过程代码中 无论如何,这些错误超出了SQL代码或存储过程的控制范围。编号较低的错误是“硬”错误,您对此无能为力,即使您捕获了它。它位于服务器(而不是您的)域

在JDBC或SQL中是否有一种方法可以通过某种方式包装exec语句来防止陷阱

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

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

  • 无论如何,这些错误超出了SQL代码或存储过程的控制范围。编号较低的错误是“硬”错误,您对此无能为力,即使您捕获了它。它位于服务器(而不是您的)域中。硬盘错误;1205服务器决定线程无法继续,并终止spid

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

  • 但最重要的是这一点。通过在事务打开时处理用户交互,您正在违反事务控制的基本规则(在您的权限范围内)。规则(40年不变)是:

    • 在没有打开事务的情况下执行所有用户交互
    • 完成后,终止进一步的用户交互
    • 开始交易
    • 执行所有DML,然后
    • 提交
      .
  • 不遵守这些规则将导致各种问题,这些问题很容易预防(通过遵守规则):

    • 非受控锁定持续时间
    • 挂起的事务(等待已吃午餐的用户)
    • 响应非常慢,服务器处于空闲状态,等待锁定
      .
      如果你开车,当然,你可以在郊区的街道和购物中心闲逛,但一旦你在高速公路上找到一辆车,你就不能低于限速;你不能停下来等乘客。如果你这样做,你会把所有人都挂断。试图截住会引起警察追捕你的手机电话,或者试图阻止警察把你拖走,这在某种程度上超出了你的能力,尽管他们可能很强大。
      .
  • 在正常情况下,当服务器遇到硬错误并取消spid(当然包括回滚)时,问题就解决了。行为符合ANSI SQL 89(92年以前)的规定。事务是原子的、持久的。现在,如果您不为该模型编写代码(提供隔离和一致性),它就不是“事务”,它只是一个跨时间和空间的不受控制的SQL字符串,很容易中断;脆弱和易受伤害

    显然,这意味着NO自动提交和NO链接,因为它违反了ANSI SQL标准。令人遗憾的是,(a)MS提供了这样一种病态的功能,(b)人们使用它,却不了解其危险性和不合规性

  • 我建议您为自己生成的代码负责,并在设计和编写任何代码之前,对自己进行重新教育,了解服务器实际如何工作,它实际做什么,而不是关心自己认为服务器应该做什么和不应该做什么(这是徒劳的,因为它不会改变)

  • 用你的话说,它肯定会执行try/catch/finally,它捕获的错误有一半会让你大吃一惊,所以你的try/catch永远不会执行。SQL代码最终尝试的概念并不存在。SQL是一种高级数据库操作语言,而不是控制硬件资源的低级语言

    如果你在高速公路上开车,你不能困在(a)你前方十公里处的桥撞毁或(b)警察在你前方一公里处关闭高速公路

    试图控制无法控制的自然是

  • 对。使用

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

    这与PerformanceDBA提出的主要有效的观点是分开的

    其他链接:

    • (尽管读了整篇文章)
    • 所以寻找

    为存储过程提供模板不是更容易(也更有意义)吗?这样就可以很快地对代码进行正确的检查,这已经完成了,包括标准错误处理,但是由于SQL Server 2005没有尝试/捕获/最终的概念,只需尝试/catch,就可以注入简单的逻辑,在事务的中间返回一个事务,使事务打开。我们需要一个更好的解决方案来检测和监控这些类型的错误。@Scott Markwell:finally在“END CATCH”之后有效@gbn,可能存在代码转义,在捕获后不会立即运行代码。在真正的try/catch/finally模式中,它将在何处运行。@Scott Markwell:如果使用try/catch,则不会运行:任何未能转到catch块的错误都意味着代码从未运行或编译过,相当多的情况下,您假设编写代码的人是绝对正确的。我不能这样假设。人类编写代码、审查代码、打包以供部署。所有已分析的用例都表明,在这种情况下,适当的操作过程是回滚挂起事务,如果未启用连接池,则无论如何都会这样做。我不是在试图防范服务器本身,而是在防范人为错误。有多种方法可以减轻人为错误,这是其中之一。让我更清楚一点,错误266不会回滚事务,这就是