Sybase中的JDBC事务控制

需要JAVA中JDBC事务控制机制的帮助。

问题:

我们的Sybase DB中有一些存储过程需要在Unchained模式下运行。 由于我们正在更新两个不同数据库(不幸的是,两个Sybase)的数据,因此如果出现任何故障,我们需要能够回滚所有先前的事务。

但是使用Unchained Mode(自动提交 – 启动)运行并没有帮助我们进行回滚,因为一些SP已经提交了事务。

Connection connection = getConnection(); PreparedStatement ps = null; try{ String sql = getQuery(); // SQL Chained Mode ps = connection.prepareStatement(sql); ps.executeUpdate(); //Step 1 . . sql = getTransctionQuery(); // SQL Unchained Mode connection.setAutoCommit(true); //Step 2 ps = connection.prepareStatement(sql); ps.executeUpdate(); connection.setAutoCommit(false); . . sql = getQuery(); // SQL Chained Mode ps = connection.prepareStatement(sql); ps.executeUpdate(); //Step 3 This step fails. connection.commit(); }catch(){ connection.rollback(); //Doesn't rollback step 1 and understandably step 2. } finally{ connection.close(); //cleanup code } 

理想情况下,如果3失败,我们希望有效地回滚步骤1和步骤2。

当前解决方案

我们的想法是重新发明轮子并编写我们自己的回滚版本(通过删除插入的记录并从Java恢复更新的值)。

需要有效解决方案

由于这个解决方案是精力充沛而不是万无一失的, 我们想知道是否还有其他更好的解决方案。

谢谢

您需要执行显式的BEGIN TRANSACTION语句。 否则,每个DML都是一个您无法控制的事务。 显然,自动提交也必须关闭。