在net.sourceforge.jtds.jdbc.Driver的setAutoCommit()中是否有"set chained"错误?



我对set chained方法中的语句有些混淆setAutoCommit() net.sourceforge.jtds.jdbc.Driver

源代码说:

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

但是,它不应该是向后的,并且链接应该关闭自动提交==false?


我遇到这种情况的原因如下:

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

  • 使用 net.sourceforge.jtds.jdbc.Driver 打开 Sybase 连接

  • 调用集自动提交(假)

  • 执行 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.

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

sp_procxmode your_stored_Procedure, 'anymode'

在您的情况下your_stored_Procedure = MySP1,则应运行以下代码:

 sp_procxmode MySP1, 'anymode'

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

我已经让它工作了

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

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

SET CHAINED OFF
begin transaction

最新更新