Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sybase中的JDBC事务控制_Java_Sql_Stored Procedures_Rollback_Sqltransaction - Fatal编程技术网

Java Sybase中的JDBC事务控制

Java Sybase中的JDBC事务控制,java,sql,stored-procedures,rollback,sqltransaction,Java,Sql,Stored Procedures,Rollback,Sqltransaction,需要JAVA中JDBC事务控制机制的帮助 问题: 我们的Sybase DB中有某些存储过程需要在未锁定模式下运行。由于我们在两个不同的数据库(不幸的是,两个都是Sybase)上更新数据,因此如果出现任何故障,我们需要能够回滚以前的所有事务 但是,在未约束模式下运行(autocommit-on)对回滚没有帮助,因为一些SP已经提交了事务 Connection connection = getConnection(); PreparedStatement ps = null; try{ Str

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

问题:

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

但是,在未约束模式下运行(autocommit-on)对回滚没有帮助,因为一些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本身就是一个您无法控制的事务。显然,自动提交也必须关闭。

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

这就是事务管理器的初衷。看看Spring事务管理是否可以帮助您:这就是事务管理器的初衷。查看Spring事务管理是否可以帮助您: