1
解决提到的问题here。使用多个数据库连接导致死锁
我们正在创建和使用2个相同的JDBC单例连接(Regular,Proxy)。
- 但是通过这样做,当我们尝试在同一个表上连续使用两个连接以进行多次插入和更新时,我们正面临死锁。
- 发生这种情况时,我无法从数据库工具(Aqua Data Studio)运行任何查询。
- 我的假设是,它无限期地等待其他连接释放锁定。
注:我们面对的不是线程多在这里。
问题:
// Auto Commit false
// Singelton
Connection connection = getConnection(); //same
// Auto Commit true
// // Singelton
Connection proxyConnection= getConnection(); //same
PreparedStatement ps = null;
try{
connection.setAutoCommit(false);
//Step 1
String sql = getQuery();
ps = proxyConnection.prepareStatement(sql);
ps.executeUpdate();
.
.
//Step 2
// if I don't execute this step everything works fine.
sql = getTransctionQuery();
ps = connection.prepareStatement(sql);
ps.executeUpdate();
.
.
//Step 3
sql = getQuery();
ps = proxyConnection.prepareStatement(sql);
ps.executeUpdate(); // this line never completes (if Step 2 runs)
}catch(){
connection.rollback(); //Doesn’t rollback step 1 and understandably step 2.
}
finally{
connection.close(); //cleanup code
proxyConnection.close();
}
问:
- 如何解决这个问题?
- 如何确保不同的连接,虽然他们使用相同的类加载器创建,但不会锁定数据库/表。
感谢
使用两个连接是国际海事组织不是一个好主意。如果步骤3修改了在步骤2中锁定的数据,则会出现该行为。我认为您在Oracle中需要类似* autonomous transaction *的内容 - 请参阅[this](http://stackoverflow.com/questions/26866521/autonomous-transactions-in -sybase-ase-15-5)有所帮助。 –
@up我完全同意。如果需要从2个不同的数据库获取数据,则可以使用两个连接。 – FilMiOs
@MarmiteBomber我同意但如何解决这里提到的问题http://stackoverflow.com/questions/35800951/jdbc-transaction-control-in-sybase – SRJ