我试图想出一个处理事务锁及其恢复的解决方案。
我有以下代码:
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。
答案 0 :(得分:0)
Dbms可以使用锁。您可以通过乐观或悲观锁定,隔离级别,mvcc,......来增加或减少数量。 最后将使用锁定并可能导致死锁或等待时间过长。我能想到的最合理的解决方案是超时。 重要的是,您如何从超时异常中恢复。
恢复应该是,应该在超时后重试事务。通常这解决了大多数情况。为了确保您也可以处理案件的原因,锁定会停留更长时间,您应该决定: