我正在编写一个 Java 应用程序,它需要执行一些复杂的 SQL 并在其中任何一个失败时回滚所有这些:
- 使用打开 Sybase 连接
net.sourceforge.jtds.jdbc.Driver
- 调用 setAutoCommit(false)
- 做 SQL1
- 调用存储过程“MySP1”
- 存储过程 MySP1' 不在我的控制之下
- 它有
EXEC sp_procxmode 'dbo.MySP1','unchained'
- 做 SQL2
- 如果 SQL2 失败,则回滚所有内容(包括 SQL1),否则提交。
完成后,我从 MySP1 收到以下错误:
存储过程“MySP1”只能在非链式事务模式下运行。'
SET CHAINED OFF
' 命令将导致当前会话使用非链式事务模式。
我尝试了以下方法,但都没有帮助:
将“chained=false”添加到传递给
getConnection()
方法(advice source)的 Properties 对象。这没有效果,很可能是因为在我看来
net.sourceforge.jtds.jdbc.Driver
它不支持chained
属性。将“chained=false”添加到传递给
getConnection()
方法(advice source)的 URL 字符串。这也没有效果
之后调用
SET CHAINED OFF
SQLsetAutoCommit()
:PreparedStatement st = conn.prepareStatement("SET CHAINED OFF"); st.execute();
这没有效果。
研究如何
setAutoCommit()
运作这使我相信驱动程序中可能存在错误。但是,如果是这种情况,#1-#3 应该已经解决了这个错误
调用
setAutoCommit(true)
而不是setAutoCommit(false)
.这修复了关于非链接模式的错误,但据我了解,这意味着我不能在最后回滚 100% 的 SQL,因为到那时第一个 SQL 语句已经被自动提交。