Oracle

如何確定錯誤是否是死鎖?

  • December 2, 2016

以下事務已被選為死鎖的犧牲品:

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, “等待資源時檢測到死鎖”

原因: 事務在等待資源時彼此死鎖。

**行動:**查看跟踪文件以查看所涉及的事務和資源。必要時重試。

引用自:https://dba.stackexchange.com/questions/156921