文章转载自:
http://liumiaoyu.itpub.net/post/36765/450061
在 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)。或许有的程序员会认为麻烦,但别忘记“完壁归赵”是资源借用者的义务。
分享到:
相关推荐
`jquery.chained.remote` 是一个基于 jQuery 的插件,它主要用于实现前端表单中的级联选择效果。在 Web 开发中,级联选择通常用于处理关联数据,例如国家与城市的关系,当用户选择一个国家时,相关的城市列表会自动...
前端项目-jquery-chained,简单的链接选择。您可以从两个不同的版本中进行选择。普通版本使用select选项的类名来决定子select的内容。它不进行任何外部Ajax(j)查询。远程版本进行外部查询,并从返回的JSON响应生成...
2. **下载Chained插件**:可以从官方或者其他可靠的资源网站下载Chained插件的压缩包,解压后将`jquery.chained.js`文件包含到项目中。 3. **HTML结构**:设置需要联动的下拉菜单,每个下拉菜单都有一个唯一的ID,...
SET CHAINED command not allowed within multi-statement transaction. ``` 这个错误表明在多语句事务中执行了不允许的`SET CHAINED`命令。在Sybase数据库中,`SET CHAINED`是一个配置选项,用于控制是否启用行级...
Ajax-chained-combobox.zip,带有laravel和vuejs的简单链式组合框,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载...
* 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 ...
如果您不想进行外部查询来设置子选择的内容,请使用jquery.chained.js 。 此版本使用数据属性来确定内容。 对于更复杂的场景,维护数据属性将变得很麻烦。 另外,如果要对数据库进行查询,请使用jquery.chained....
"fb_sys_fops.rar_Chained"这个压缩包文件包含了与中断处理相关的源代码,特别是关于"Chained IRQ handlers"的支持。 **Chained IRQ Handlers(级联中断处理)** 是一种在Linux内核中断处理框架中实现的机制,允许...
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...
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...
>(Person.class) // simple binding - a normal use case .bind(Handlers.messages(phoneErrors::setText), Person::getPhone) // multi binding with chained handlers .bind(Handlers.messages(nameErrors::...
事务模式分为链式事务(Chained Transaction)和非链式事务(Unchained Transaction)。在链式事务模式下,存储过程自动开始一个事务,而非链式事务是缺省模式。链式事务模式适用于事务跨越多个语句,而非链式事务适用于...
// run sequential task chained jj . script ( [ // first task function ( next ) { // at end of this process 'next' point to second task and run it callAsyncProcess1 ( next ) ; } , // second task...
除了基本的异常处理机制,还有一些高级特性,如自定义异常类、异常过滤(filter expressions)、异常链(chained exceptions)等,可以帮助开发者更精确地控制异常行为。同时,良好的异常处理策略应遵循以下原则: -...
composer require nordsoftware/lumen-chained-exception-handler 用法 将$app->singleton()调用替换为以下内容,该调用将在bootstrap/app.php注册具体异常处理程序: $ app -> instance ( Illuminate \ ...
标题中的“Chained Audio Plugins-开源”指的是一个开源项目,专注于实现音频处理的插件链接功能。这样的系统允许用户在音频工作流程中串联多个插件,以实现复杂的音频效果和处理。这种技术常见于音乐制作、音频编辑...
I have made the analog S-meter scaling, so if set to medium or large and there isn’t room for it to display correctly it is automatically reduced in size. Found and fixed a reproducible bug related ...
Added support for ACTION_PORT_ID, ACTION_DROP, ACTION_OF_POP_VLAN, ACTION_OF_PUSH_VLAN, ACTION_OF_SET_VLAN_VID, ACTION_OF_SET_VLAN_PCP and ITEM_PORT_ID. Added support for 32-bit compilation. Added ...
"intellij-idea-generate-chained-accessors" 是一个IntelliJ IDEA的插件,它自动化了getter、setter和builder方法的生成过程,特别是针对当前类的所有字段。这个插件最初是在Google Code上托管的,但现在可能已经...
$ npm install i18next-chained-backend 接线: import i18next from 'i18next' ; import Backend from 'i18next-chained-backend' ; i18next . use ( Backend ) . init ( i18nextOptions ) ; 与所有模块一样,...