gpt4 book ai didi

java - Sybase 中的 JDBC 事务控制

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:24 27 4
gpt4 key购买 nike

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

问题:

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

但是以非链接模式(自动提交 - 开启)运行并不能帮助我们进行回滚,因为一些 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 本身就是一个您无法控制的事务。显然自动提交也必须关闭。

关于java - Sybase 中的 JDBC 事务控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35800951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com