Sybase中的JDBC事务控制

时间:2016-03-04 16:20:31

标签: java sql stored-procedures rollback sqltransaction

需要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恢复更新的值)。

需要有效的解决方案

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

由于

1 个答案:

答案 0 :(得分:0)

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