Oracle
如何確定錯誤是否是死鎖?
以下事務已被選為死鎖的犧牲品:
public void side2() throws SQLException, InterruptedException { TestConnectionPool connectionPool = new TestConnectionPool(); try(Connection connection = connectionPool.get()){ connection.setAutoCommit(false); try { PreparedStatement update1 = connection.prepareStatement("update t2 set j=j-1"); update1.execute(); Thread.sleep(3000L); PreparedStatement update2 = connection.prepareStatement("update t1 set j=j-1"); update2.execute(); connection.commit(); }catch (SQLException ex){ System.out.println("ex.getErrorCode()=" + ex.getErrorCode()); System.out.println("ex.getSQLState()=" + ex.getSQLState()); connection.rollback(); } } }
其輸出如下:
/* ex.getErrorCode()=60 ex.getSQLState()=61000 */
我應該使用什麼來確定錯誤是否是死鎖:錯誤程式碼、SQL 狀態或兩者兼而有之?
我猜
ex.getErroCode()
已經返回ORA-00060: deadlock detected while waiting for resource
,這是死鎖錯誤。在返回的錯誤程式碼前添加ORA
,然後線上搜尋或使用 Oracle 提供的工具oerr
(如下所示)確定錯誤詳情。一個錯誤程式碼。這是一個整數值,用於標識導致
SQLException
實例被拋出的錯誤。它的值和含義是特定於實現的,並且可能是底層數據源返回的實際錯誤程式碼。通過呼叫方法檢索錯誤SQLException.getErrorCode
。更多的…
[oracle@orcl trace]$ oerr ora 60
00060, 00000, “等待資源時檢測到死鎖”
原因: 事務在等待資源時彼此死鎖。
**行動:**查看跟踪文件以查看所涉及的事務和資源。必要時重試。