[英]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.