在 Sybase ASE 实际应用中,特别是在 ASE + J2EE 应用中,较容易出现 SET CHAINED command not allowed within multi-statement transaction.的异常(尽管到版本 15.0.1 为止,ASE 并不支持异常机制,但本文为了方便,统一采用“异常”一词)。有的开发人员认为这是 Sybase 数据库的问题;有的认为是多次调用 setAutoCommit() 方法的问题;有的开发人员则认为这是 jConnect 的问题,甚至从 jConnect 的代码上直接屏蔽此异常。
然而,SET CHAINED 异常倒底是怎样产生的?
一、数据库层
首先,让我们看看 set chained。下面的文字片段摘自《ASE 12.5.2 Reference Manual: Commands》,Page 430:
chained
begins a transaction just before the first data retrieval or data modification
statement at the beginning of a session and after a transaction ends. In
chained mode, Adaptive Server implicitly executes a begin transaction
command before the following statements: delete, fetch, insert, lock table,
open, select, and update. You cannot execute set chained within a transaction.
从此段文字可以得知,当 set chained on 后,delete、fetch、insert、lock table、open、select 以及 update 语句将自动启动一个事务,并要求显式的完成事务,即明确地调用 commit/rollback。同时,在事务中,不允许设置 chained 模式。
下面的 sql 代码片断将说明在数据库层上 SET CHAINED 错误信息是如何产生的。
1> set chained on
2> go
1> set chained on
2> go
1> begin tran
2> go
1>
似乎多次调用 set chained 并不会产生异常。接下来,
1> set chained on
2> go
Msg 226, Level 16, State 1:
Server 'FLYBEAN', Line 1:
SET CHAINED command not allowed within multi-statement transaction.
1> set chained off
2> go
Msg 226, Level 16, State 1:
Server 'FLYBEAN', Line 1:
SET CHAINED command not allowed within multi-statement transaction.
1>
显然,处于事务环境下,调用 set chained 是会发生异常的,这一点手册上也非常明确的指出了。但为什么前面的片断中两次连续调用 set chained 却不会产生异常呢?请注意文档上这一句:Adaptive Server implicitly executes a begin transaction command before the following statements: 。
重建一个数据库连接,从头开始:
1> set chained on
2> go
1> select 1
2> go
-----------
1
(1 row affected)
1> set chained on
2> go
Msg 226, Level 16, State 1:
Server 'FLYBEAN', Line 1:
SET CHAINED command not allowed within multi-statement transaction.
1> set chained off
2> go
Msg 226, Level 16, State 1:
Server 'FLYBEAN', Line 1:
SET CHAINED command not allowed within multi-statement transaction.
1>
在执行 select 1 之前,数据库自动启动了一笔事务,因此不能再执行 set chained。接下来,完成隐式启动的事务:
1> rollback
2> go
1> set chained off
2> go
1>
二、J2EE 层
J2EE 应用中,一些轻量级的数据访问层实现采用 Connection 的setAutoCommit(false) + commit()/rollback() 的方式来管理事务。通过对 jConnect 的反编译以及对 spt_mda 数据的分析,可以得知 setAutoCommit(true) = SET CHAINED OFF;setAutoCommit(false) = SET CHAINED ON,下图以顺序图展示调用 setAutoCommit() 方法时,实际发生的交互。
另一方面,J2EE 应用中大多采用了连接池。应用在调用 Connection.close() 方法时,实际上并没有真正地关闭连接,而是将连接回收到池中。假设连接的初态是 chained off。如果应用在取得连接后调用该连接的 setAutoCommit(false) 方法来启动事务,在事务完成后,通过 close() 方法回到池中时,未能恢复到初始状态(即 chained off),则应用多次获取该连接并进行一定操作后,就很有可能出现异常。见下图:
通过上面的分析,理解了产生此异常的原因,就很容易避免此异常,即在完成事务后,关闭连接前,显式地调用 setAutoCommit(true)。或许有的程序员会认为麻烦,但别忘记“完壁归赵”是资源借用者的义务。
转载自:http://liumiaoyu.itpub.net/post/36765/450061
分享到:
相关推荐
SET CHAINED command not allowed within multi-statement transaction. ``` 这个错误表明在多语句事务中执行了不允许的`SET CHAINED`命令。在Sybase数据库中,`SET CHAINED`是一个配置选项,用于控制是否启用行级...
they can request that the EAL instead uses preferred values provided by the PMD, falling back to defaults within the EAL if the PMD does not provide any. The provision of such tuned values now ...
* Proxy chain: user-defined list of proxies chained together. Usability : * Run any program through proxy server. * Access the Internet from behind a restrictive firewall. * Hide your IP * Run ...
在这个例子中,`MICE`(Multiple Imputation by Chained Equations)是多重插补的一个实现,用于同时处理数值型和类别型变量的缺失值。 **最佳实践** 使用`autoimpute`时,最好遵循以下最佳实践: - 在使用前,先...
Ajax-chained-combobox.zip,带有laravel和vuejs的简单链式组合框,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载...
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、...
前端项目-jquery-chained,简单的链接选择。您可以从两个不同的版本中进行选择。普通版本使用select选项的类名来决定子select的内容。它不进行任何外部Ajax(j)查询。远程版本进行外部查询,并从返回的JSON响应生成...
### mod_rewrite-cheat-sheet-v2.pdf 知识点解析 ...以上内容全面覆盖了 `mod_rewrite-cheat-sheet-v2.pdf` 中的核心知识点及其应用实例,希望能帮助读者更好地理解和掌握 `mod_rewrite` 的使用技巧。
4)....Added "--el_injectjcl", "--el_createjcl", and "--el_createdbg" command-line options for ecc32/emake to inject JEDI/JCL debug info, create .jdbg file, and create .dbg file (Microsoft debug format...
they can request that the EAL instead uses preferred values provided by the PMD, falling back to defaults within the EAL if the PMD does not provide any. The provision of such tuned values now ...
These vulnerabilities, when chained together, allowed for remote code execution and complete device takeover. The exploit was reportedly used for targeted surveillance. 4. Wi-Fi Chipset ...
2. **Stream API**: The Stream API simplifies processing collections of data by providing a set of operations that can be chained together. It supports parallel processing and enhances performance when...
`jquery.chained.remote` 是一个基于 jQuery 的插件,它主要用于实现前端表单中的级联选择效果。在 Web 开发中,级联选择通常用于处理关联数据,例如国家与城市的关系,当用户选择一个国家时,相关的城市列表会自动...
$ npm install i18next-chained-backend 接线: import i18next from 'i18next' ; import Backend from 'i18next-chained-backend' ; i18next . use ( Backend ) . init ( i18nextOptions ) ; 与所有模块一样,...
Transaction分类包括Flat Transaction、Chained Transaction、Nested Transaction和Distributed Transaction等。在数据库事务中,检查点和系统故障恢复是非常重要的两个方面。 此外,本技术资料还详细介绍了数据库...
"intellij-idea-generate-chained-accessors" 是一个IntelliJ IDEA的插件,它自动化了getter、setter和builder方法的生成过程,特别是针对当前类的所有字段。这个插件最初是在Google Code上托管的,但现在可能已经...
**jQuery多级联动下拉插件Chained简介** 在网页设计中,经常需要实现多级联动下拉菜单的效果,例如省份、城市、区县的选择,这样的功能可以方便用户快速筛选和定位信息。jQuery Chained是一款优秀的插件,专门用于...
一个双向LSTM程序 Long Short Term... All RNNs have a chained form of repetitive neural network modules. In the standard RNN, this repetitive module has only a very simple structure, such as a tanh layer.)