2016-03-09 57 views
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(); 
} 

问:

  • 如何解决这个问题?
  • 如何确保不同的连接,虽然他们使用相同的类加载器创建,但不会锁定数据库/表。

感谢

+1

使用两个连接是国际海事组织不是一个好主意。如果步骤3修改了在步骤2中锁定的数据,则会出现该行为。我认为您在Oracle中需要类似* autonomous transaction *的内容 - 请参阅[this](http://stackoverflow.com/questions/26866521/autonomous-transactions-in -sybase-ase-15-5)有所帮助。 –

+0

@up我完全同意。如果需要从2个不同的数据库获取数据,则可以使用两个连接。 – FilMiOs

+0

@MarmiteBomber我同意但如何解决这里提到的问题http://stackoverflow.com/questions/35800951/jdbc-transaction-control-in-sybase – SRJ

回答

0

我在这里不是专家,但运行的查询,然后忘记提交(或取消)时,我曾经有过与Oracle数据库的问题。所以我认为在步骤2之后没有提交的事实会锁定下一次访问的数据库。

+0

我不想在第2步之后提交。我想在第3步之后提交,以使我的回滚工作用于常规连接。 – SRJ