有没有办法通过以某种方式包装exec语句来在JDBC或SQL内部捕获error 266?
我们正在寻求围绕存储过程开发一个保护措施,以一种常见的方式保持事务处理。这有助于防止在与连接池结合时可能导致严重问题的程序员错误。
答案 0 :(得分:3)
它可以抑制错误266并在任何情况下强制回滚,包括客户端命令超时,这只是一个中止。
这与PerformanceDBA提出的几点有效。
其他链接:
答案 1 :(得分:1)
编号较低的错误,15000及以下的IIRC,以及较高的严重性级别,中断执行。这意味着整个线程被中断,不可能将其捕获到存储的proc代码中。
无论如何,错误超出了SQL代码或存储过程的控制范围。较低编号的错误是“硬”错误,即使您确实陷阱,也无法对此做任何事情。它位于服务器(不是您的)域中。例如。硬盘错误; 1205.服务器决定,线程无法继续,并终止spid。
陷入您未管理,设置或控制的外部错误域是不可行的。所以我无法理解你期望的基础。 trapa(例如)硬件错误和死锁的唯一方法就是编写自己的服务器。
但最重要的是这个。通过在交易开放时处理用户交互,您违反了交易控制的基本法则(在您的权力范围内)。规则(40年不变)是:
不遵守这些规则会导致容易出现的各种问题(遵守规则):
在正常情况下,当服务器遇到硬错误并取消您的spid(当然包括回滚)时,问题将被关闭。符合ANSI SQL 89(早于92)的行为。交易是Atomic和Durable。现在,如果你不为该模型编写代码(提供隔离和一致性),它不是“事务”,它只是一串跨时空分布的不受控制的SQL,易于中断;脆弱而脆弱。
显然,这意味着 NO AUTOCOMMIT和 NO CHAINED,因为它违反了ANSI SQL标准。 (a)MS提供如此恶劣的特征,并且(b)人们使用它,而不了解危险和违规情况,这是非常可悲的。
不要因为你认为服务器应该和不应该做什么而感到沮丧(这是徒劳的,因为它不会改变),我建议你对你生成的代码负责,并教育自己在设计和编写任何代码之前,了解服务器的实际工作方式,实际工作情况。
提出你的条款哦,它肯定会执行 try / catch / finally ,它捕获的一半错误导致它让你失望,所以你的 try / catch永远不会执行。 您的 SQL代码尝试最终的概念不存在。 SQL是一种高级数据库操作语言,而不是可以控制硬件资源的低级语言。
如果你正在高速公路上驾驶汽车,你不能陷入(a)在你面前十公里处坠毁的桥梁或(b)警察在你面前一公里关闭高速公路
试图控制无法控制的当然是......