我如何解决“存储过程'MySP1'只能在未链接的事务模式下运行”错误?

问题描述 投票:3回答:2

我正在编写一个Java应用程序,它需要执行一些复杂的SQL并在所有应用程序失败的情况下将其全部回退:

  • 使用net.sourceforge.jtds.jdbc.Driver打开Sybase连接
  • 调用setAutoCommit(false)
  • 执行SQL1
  • 调用存储的过程'MySP1'
    • 存储的过程MySP1'不在我的控制之下
    • 它有EXEC sp_procxmode 'dbo.MySP1','unchained'
  • 执行SQL2
  • 如果SQL2失败,请回滚所有内容(包括SQL1),否则进行提交。

完成此操作后,我从MySP1中收到以下错误:

存储过程'MySP1'只能在未链接的事务模式下运行。 'SET CHAINED OFF'命令将导致当前会话使用未链接的事务模式。


我尝试了以下操作,但都无济于事:

  1. 向传递给getConnection()方法(advice source)的Properties对象添加“ chained = false”。

    这没有效果,很可能是因为在我看来net.sourceforge.jtds.jdbc.Driver确实支持[[0]]属性。

  2. 向传递给chained方法(getConnection())的URL字符串添加“ chained = false”。
  3. 这也没有效果

  4. advice source之后称为SET CHAINED OFF SQL:
  5. setAutoCommit()

    这无效。

  6. 研究 PreparedStatement st = conn.prepareStatement("SET CHAINED OFF"); st.execute(); 的工作原理
  7. 这使我相信可能存在setAutoCommit()。但是,在这种情况下,#1-#3应该已经解决了该错误]]] >>

  8. 称为bug in the driver,而不是setAutoCommit(true)

    这解决了有关取消链接模式的错误,但是据我所知,这意味着我最后无法回滚100%的SQL,因为到那时为止,第一个SQL语句已经被自动提交了。

    ] >
  9. 我正在编写一个Java应用程序,该应用程序需要执行一些复杂的SQL并在失败时全部回滚:使用net.sourceforge.jtds.jdbc.Driver打开Sybase连接调用setAutoCommit(false)做...] >

    我的理解是jdbc的“自动提交”与Sybase链接模式相同。

    [Autocommit true是指在每个语句之后提交-未链接:事务不是全部在一个可以提交并作为一个回滚的“链”中。

    所以您可能会被卡住。如果您无法更改该SP,则它将始终关闭链接模式。您收到一条合理的消息。它实际上是错误消息,还是仅仅是您的jdbc代码不处理它(即显示它或不显示它,但至少将其视为不是错误?)

    以防万一这些年来有人在这里看。

    我偶然发现了同一案子。您与方法3非常接近。但在这种情况下,jTDS不会启动tran(但是在Unchained模式下是必需的)。您可以通过执行

    setAutoCommit(false)

    刚跑步后

    begin transaction

java jdbc transactions sybase jtds
2个回答
1
投票
我的理解是jdbc的“自动提交”与Sybase链接模式相同。

[Autocommit true是指在每个语句之后提交-未链接:事务不是全部在一个可以提交并作为一个回滚的“链”中。

所以您可能会被卡住。如果您无法更改该SP,则它将始终关闭链接模式。您收到一条合理的消息。它实际上是错误消息,还是仅仅是您的jdbc代码不处理它(即显示它或不显示它,但至少将其视为不是错误?)


0
投票
以防万一这些年来有人在这里看。

我偶然发现了同一案子。您与方法3非常接近。但在这种情况下,jTDS不会启动tran(但是在Unchained模式下是必需的)。您可以通过执行

setAutoCommit(false)

刚跑步后
© www.soinside.com 2019 - 2024. All rights reserved.