2017-09-02 9 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(); 
} 

は今、私は2つの別々のトランザクションでlayoutテーブルを更新しています。これでロックが発生するので、setQueryTimeoutを使用してその状況をカバーし直します。

しかし、私は実際にsetQueryTimeoutがトランザクションロックを処理して回復する正しい方法であるかどうかはわかりません。その他のベストプラクティスはありますか?

私はORMのかなり普通のJavaを使用していないことに注意してください。

+0

「悲観的なロック」と「楽観的なロック」という理論はほとんど知られていませんか?多くのシナリオや多くの要件が存在する可能性があるため、一般的に「復旧」の仕方は難しいです。企業のソフトウェアの重要な問題の1つです –

+0

あなたは銀行か大きいインターネットショップを想像し、あなたはクライアントです。 「トランザクション回復ポリシー」はどのように設計する必要がありますか? –

+0

@JacekCz:申し訳ありませんが、私はこれを認識していません。 – batman

答えて

0

Dbmsはロックで動作します。オプティミスティックまたはペシミスティック・ロック、分離レベル、mvccなどで番号を増減することができます。 最後にロックが使用され、デッドロックや長い待ち時間が発生する可能性があります。このための最も合理的な解決策は、私が考えることができる、タイムアウトです。 重要なのは、タイムアウト例外からの復旧方法です。

リカバリは、タイムアウト後にトランザクションを再試行する必要があります。通常、これはほとんどのケースを解決します。おそらく

  • リトライ
  • の最大数を増やし、再試行の間

    • 待機時間間隔、:あなたもロックの原因はあなたがについて決定する必要があり、より長い時間とどまるたケースを処理できることを確認するために、
    • 戦略、どのようにシステムが問題を解決することができない場合に警告する方法。