在net.sourceforge.jtds.jdbc.Driver中的setAutoCommit()中是否存在“set chained”的错误?

时间:2012-06-09 20:28:35

标签: java jdbc transactions sybase jtds

我对set chained

setAutoCommit()方法中的net.sourceforge.jtds.jdbc.Driver语句感到困惑

source code说:

2161  if (serverType == Driver.SYBASE) {
2162            if (autoCommit) {
2163                sql.append("SET CHAINED OFF");
2164            } else {
2165                sql.append("SET CHAINED ON");
2166            }

但是,不应该倒退,而且对于autoCommit == false,链接应为OFF?


我遇到这个问题的原因如下:

我正在编写一个Java应用程序,它需要执行一些复杂的SQL并在其中任何一个失败时回滚所有这些:

  • 使用net.sourceforge.jtds.jdbc.Driver

  • 打开Sybase连接
  • 调用setAutoCommit(false)

  • 执行SQL1

  • 调用存储过程' MySP1'

    • 存储过程MySP1'不受我的控制

    • 它有EXEC sp_procxmode 'dbo.MySP1','unchained'

  • 执行SQL2

  • 如果SQL2失败,请回滚所有内容(包括SQL1),否则提交。

完成后,我从MySP1收到以下错误:

 Stored procedure 'MySP1' may be run only in unchained transaction mode. The 'SET CHAINED OFF' command will cause the current session to use unchained transaction mode.

2 个答案:

答案 0 :(得分:2)

我遇到了几乎相同的问题,并通过运行以下SQL来解决它。希望它可以帮助你。

sp_procxmode your_stored_Procedure, 'anymode'

在你的情况 your_stored_Procedure = MySP1 ,那么你应该运行以下代码:

 sp_procxmode MySP1, 'anymode'

答案 1 :(得分:0)

以防万一在漫长的7年后有人来这里,

我通过

使它起作用
connection.setAutoCommit(false); // this is mandatory, as without it jTDS will commit each statement.

在Java中,并显式执行SQL代码:

SET CHAINED OFF
begin transaction