需要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恢复更新的值)。
需要有效的解决方案
由于这个解决方案是精力充沛而不是万无一失的,我们想知道是否还有其他更好的解决方案。
由于
答案 0 :(得分:0)
您需要执行显式的BEGIN TRANSACTION语句。否则,每个DML都是一个您无法控制的事务。显然,自动提交也必须关闭。