`
zhaixf2001
  • 浏览: 25363 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

sybase SET CHAINED command...异常

阅读更多
文章转载自: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.chained.remote` 是一个基于 jQuery 的插件,它主要用于实现前端表单中的级联选择效果。在 Web 开发中,级联选择通常用于处理关联数据,例如国家与城市的关系,当用户选择一个国家时,相关的城市列表会自动...

    前端项目-jquery-chained.zip

    前端项目-jquery-chained,简单的链接选择。您可以从两个不同的版本中进行选择。普通版本使用select选项的类名来决定子select的内容。它不进行任何外部Ajax(j)查询。远程版本进行外部查询,并从返回的JSON响应生成...

    jquery多级联动下拉插件chained(附DEMO)

    2. **下载Chained插件**:可以从官方或者其他可靠的资源网站下载Chained插件的压缩包,解压后将`jquery.chained.js`文件包含到项目中。 3. **HTML结构**:设置需要联动的下拉菜单,每个下拉菜单都有一个唯一的ID,...

    快速解决Sybase JDBC DRIVER出现的问题

    SET CHAINED command not allowed within multi-statement transaction. ``` 这个错误表明在多语句事务中执行了不允许的`SET CHAINED`命令。在Sybase数据库中,`SET CHAINED`是一个配置选项,用于控制是否启用行级...

    Ajax-chained-combobox.zip

    Ajax-chained-combobox.zip,带有laravel和vuejs的简单链式组合框,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载...

    proxychains-ng-4.14.tar.xz

    * 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:链式选择jQuery和Zepto

    如果您不想进行外部查询来设置子选择的内容,请使用jquery.chained.js 。 此版本使用数据属性来确定内容。 对于更复杂的场景,维护数据属性将变得很麻烦。 另外,如果要对数据库进行查询,请使用jquery.chained....

    fb_sys_fops.rar_Chained

    "fb_sys_fops.rar_Chained"这个压缩包文件包含了与中断处理相关的源代码,特别是关于"Chained IRQ handlers"的支持。 **Chained IRQ Handlers(级联中断处理)** 是一种在Linux内核中断处理框架中实现的机制,允许...

    EurekaLog_7.5.0.0_Enterprise

    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...

    jdk1.8_win64.rar

    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...

    validation-binder:将 java.validation 与 JavaFX 结合使用的概念证明

    >(Person.class) // simple binding - a normal use case .bind(Handlers.messages(phoneErrors::setText), Person::getPhone) // multi binding with chained handlers .bind(Handlers.messages(nameErrors::...

    Sybase SQL Server与数据库的完整性研究.pdf

    事务模式分为链式事务(Chained Transaction)和非链式事务(Unchained Transaction)。在链式事务模式下,存储过程自动开始一个事务,而非链式事务是缺省模式。链式事务模式适用于事务跨越多个语句,而非链式事务适用于...

    jazz.js:让我们停止虚假的承诺。 听''Jazz.js''-

    // 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)等,可以帮助开发者更精确地控制异常行为。同时,良好的异常处理策略应遵循以下原则: -...

    lumen-chained-exception-handler:Lumen框架的链式异常处理程序

    composer require nordsoftware/lumen-chained-exception-handler 用法 将$app->singleton()调用替换为以下内容,该调用将在bootstrap/app.php注册具体异常处理程序: $ app -> instance ( Illuminate \ ...

    Chained Audio Plugins-开源

    标题中的“Chained Audio Plugins-开源”指的是一个开源项目,专注于实现音频处理的插件链接功能。这样的系统允许用户在音频工作流程中串联多个插件,以实现复杂的音频效果和处理。这种技术常见于音乐制作、音频编辑...

    sdr_radio_v3.0.23_x64.exe

    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 ...

    dpdk-18.02.2-stable

    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:从 code.google.compintellij-idea-generate-chained-accessors 自动导出

    "intellij-idea-generate-chained-accessors" 是一个IntelliJ IDEA的插件,它自动化了getter、setter和builder方法的生成过程,特别是针对当前类的所有字段。这个插件最初是在Google Code上托管的,但现在可能已经...

    i18next-chained-backend:一个i18next后端,用于链接多个后端(添加后备,缓存等)

    $ npm install i18next-chained-backend 接线: import i18next from 'i18next' ; import Backend from 'i18next-chained-backend' ; i18next . use ( Backend ) . init ( i18nextOptions ) ; 与所有模块一样,...

Global site tag (gtag.js) - Google Analytics