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