gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:47:30 25 4
gpt4 key购买 nike

我正在尝试提出一种处理事务锁及其恢复的解决方案。

我有如下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com