繁体   English   中英

Sybase中的JDBC事务控制

[英]JDBC Transaction control in Sybase

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

问题:

我们的Sybase DB中有某些存储过程需要在非链接模式下运行。 由于我们正在两个不同的数据库(不幸的是,两个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本身就是您无法控制的事务。 显然,自动提交也必须关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM