2017-09-02 106 views
1

我試圖想出一個處理事務鎖及其恢復的解決方案。如何處理Java中的事務鎖(Postgresql)

我有下面這樣的代碼:

try { 
    Connection conn = DriverManager.getConnection(url, userName, password); 
    Connection conn2 = DriverManager.getConnection(url, userName, password); 


    conn.setAutoCommit(false); 
    conn2.setAutoCommit(false); 

    conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); 
    conn2.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); 

    Statement stmt = conn.createStatement(); 
    Statement stmt2 = conn2.createStatement(); 

    stmt.setQueryTimeout(100); 
    stmt.executeUpdate("update layout set HEIGHT = 45 where ID = 2"); 
    stmt2.setQueryTimeout(10); 
    stmt2.executeUpdate("update layout set HEIGHT = 12 where ID = 2"); 
    conn2.commit(); 
    conn.commit(); 

    System.out.println("Done...."); 
} 

//TODO: should be throwing it back.. 
catch (Exception e) { 
    e.printStackTrace(); 
} 

現在我更新layout表中兩個獨立的交易。現在這會導致鎖定,因此我使用setQueryTimeout重新覆蓋了這種情況。

但我不確定setQueryTimeout是否是處理事務鎖定和恢復的正確方法。還有其他的最佳做法嗎?

請注意,我沒有使用任何ORM的普通Java。

+0

很少理論,'悲觀鎖定'和'樂觀鎖定'是你知道的嗎?總的來說很難說如何做'恢復',因爲許多場景和許多要求都可以存在。這是企業軟件中的重要問題之一 –

+0

想象一下銀行或大型互聯網商店,而你是客戶。應該設計什麼'交易恢復策略'? –

+0

@JacekCz:對不起,我不知道這一點。 – batman

回答

0

Dbms將使用鎖。您可以通過樂觀或悲觀鎖定,隔離級別,mvcc來增加或減少數量...... 最終鎖定將被使用並可能導致死鎖或長時間的等待期。我能想到的最合理的解決方案是超時。 重要的是,您如何從超時異常中恢復。

恢復應該是,該事務應該在超時後重試。通常這解決了大多數情況。爲了確保你也可以處理案件是鎖的原因停留較長時間,你應該決定有關:

  • 試之間的等待時間間隔,可能增加
  • 的最大數量
  • 的策略,如果系統無法解決問題該如何報警。