我正在尝试提出一种处理事务锁及其恢复的解决方案。
我有如下代码:
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/