如何在Java中处理事务锁(Postgresql)

时间:2017-09-02 13:39:29

标签: java postgresql transactions

我试图想出一个处理事务锁及其恢复的解决方案。

我有以下代码:

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。

1 个答案:

答案 0 :(得分:0)

Dbms可以使用锁。您可以通过乐观或悲观锁定,隔离级别,mvcc,......来增加或减少数量。 最后将使用锁定并可能导致死锁或等待时间过长。我能想到的最合理的解决方案是超时。 重要的是,您如何从超时异常中恢复。

恢复应该是,应该在超时后重试事务。通常这解决了大多数情况。为了确保您也可以处理案件的原因,锁定会停留更长时间,您应该决定:

  • 重试之间的等待时间间隔,可能会增加
  • 最大重试次数
  • 策略,如果问题无法由系统解决,如何报警。