2010-07-21 201 views
4

我使用JDBC(通過Spring的JDBCTemplate)訪問數據庫中的少量表。雖然我還沒有發生任何事情,但我擔心死鎖的可能性。JDBC和死鎖避免問題(基本)

我的印象是有一種方法來指定查詢的鎖定順序,以訪問多個表以避免死鎖,但我不知道這是否是在數據庫級別設置的類型創建我的表,或者如果我必須明確地用我的JDBC查詢做些事情。

即,是否有全局設置或用於指定鎖定順序的東西,或者是否必須在每個查詢/更新中完成。

謝謝。

回答

5

這是要在事務級別進行管理。當雞蛋問題存在時,您通常只會面臨僵局。即每個多個查詢有兩個同時行鎖定事務,其結果取決於事務的其他其他事務。如果其他交易在執行查詢時未完成,那麼其他交易將不能完成其自己的查詢。

我不確定JDBCTemplate如何管理事務,但JDBC連接默認情況下不是事務性的。一旦您將Connection#setAutoCommit()設置爲false(或將其配置爲默認值),則交易將開始並在您致電Connection#commit()時完成。

爲避免死鎖,規則#1避免在單個事務中混合SELECTINSERT/UPDATE/DELETE語句。當混合是一見鍾情時,那麼你至少應該嘗試將它重寫成一個/嵌套語句。這通常是可能的。這樣你就不需要在事務中執行這些查詢。此外,像PostgreSQL和Oracle這樣的一些數據庫可以自動檢測死鎖,並且會自動回滾其中一個事務,通常是稍後啓動的事務。在JDBC端,您將收到一個特定的SQLException

+0

因此,我應該不是做像測試存在然後插入的東西,或者它是唯一危險的,如果我做一個選擇,將查看多行,然後插入,如果沒有找到結果? – 2010-07-21 19:05:30

+0

非常真實:)而是捕捉到獨特的約束。另見[這個答案](http://stackoverflow.com/questions/3101820/how-to-check-for-duplicate-entries-in-database/3101957#3101957)。 – BalusC 2010-07-21 19:14:56