我的朋友描述了一個場景,並挑戰我找到解決方案。他正在使用Oracle數據庫和JDBC連接,並將讀取提交爲事務隔離級別。在其中一個交易中,他更新記錄,執行選擇語句並提交交易。當一切發生在一個線程內時,事情都很好。但是,當處理多個請求時,發生死鎖。JDBC事務死鎖:需要解決方案嗎?
- 線程A更新記錄。
- 線程B更新另一條記錄。
- 線程A發出select語句並等待線程B的事務完成提交操作。
- 線程B發出select語句並等待線程A的事務完成提交操作。
以上原因導致死鎖。由於它們使用命令模式,因此基本框架只允許發出一次提交(在所有數據庫操作結束時),因此它們無法在選擇語句之前立即發出提交。
我的論點是:線程-A應該選擇所有提交的記錄,因此不應該發佈。但他表示,線程A肯定會等到線程B提交記錄。真的嗎?
什麼是所有的方式,以避免上述問題?是否有可能改變隔離級別(不改變底層java框架)?
有關基本框架的一些信息:它與Struts動作類似,每個請求都由一個動作處理,事務在執行前開始並在執行後提交。
我不明白「等待......交易完成」,因爲在Oracle讀取提交時,讀者不會阻止作者和作者不會阻止讀者。 – davek 2010-04-03 16:14:06