1

我对方法中的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            }

但是,它不应该倒退吗,并且对于 autoCommit==false 应该关闭链接?


我遇到这个的原因如下:

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

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

  • 调用 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.
4

2 回答 2

2

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

sp_procxmode your_stored_Procedure, 'anymode'

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

 sp_procxmode MySP1, 'anymode'
于 2013-05-22T09:44:22.250 回答
0

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

我已经让它工作了

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

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

SET CHAINED OFF
begin transaction
于 2020-06-04T22:43:58.953 回答