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

标签 java sql jdbc sybase sqltransaction

解决提到的问题here .

我们正在创建并使用 2 个相同的 JDBC 单例连接(常规、代理)。

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

问题:

  • 如何解决此问题?
  • 如何确保不同的连接(尽管它们是使用相同的类加载器创建)不会锁定数据库/表。

谢谢

最佳答案

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

关于java - 使用多个数据库连接会导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903283/

相关文章:

mysql - 将查询中的表拆分为多个表(使用 "DISTINCT")

可以从sql生成图表的Java库

sql - 搜索表 - 如果找到结果,则不要搜索下一个表

java - 将 Eclipse Web 应用程序连接到 sql 2012 数据库

java - 未检测到 JDBC MySQL 新插入

java - 如何在java中访问zip文件中的文件和文件夹列表?

java - 如何在 Buffer Writer 中创建新行 - Java

java - 自定义对话框 onClickListener

java - JDBC 对象列表索引越界

java - Firebase身份验证-防止用户同时登录一个帐户