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

标签 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。

最佳答案

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

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

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

关于java - 如何在 Java (Postgresql) 中处理事务锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46014398/

相关文章:

sql - PostgreSQL 使用内连接删除

java - 自动将 XAResources 登记/清理到新 Tx 中的方法?

java - 如何仅检索从 Cassandra 更改的信息?

java - 在 Android 上的 OpenCV 中旋转 VideoCapture

java - 如何获取位置坐标?

java - 使用 HashMap 和 List 进行嵌套双括号初始化

sql - 如何在 PostgreSQL 中使用 LOWER 创建 GIN 索引?

database - 在PostgreSQL中获取lobject的大小

java - Spring @Transactional注解: Self Invocation

Android 包管理器因 TransactionTooLargeException 而死