使用多个数据库连接会导致死锁

时间:2016-03-09 21:47:04

标签: java sql jdbc sybase sqltransaction

要解决提及here的问题。

我们正在创建和使用2个相同的JDBC Singleton Connections(常规,代理)。

  • 但是,当我们尝试在同一个表上连续使用两个连接进行多次插入和更新时,我们面临死锁。
  • 当发生这种情况时,我也无法从数据库工具(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 个答案:

答案 0 :(得分:0)

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