Oracle 12c - 捕获ORA-04020死锁错误未按预期工作

时间:2017-07-26 17:58:24

标签: oracle plsql deadlock database-deadlocks

我们在处理XML文件时经常遇到死锁,直到我们通过在死锁时立即重新处理文件来解决这些问题。

这就是我的异常处理程序:

  EXCEPTION
     WHEN OTHERS
     THEN
     --Handle deadlocks by reprocessing the file
        IF SQLERRM LIKE '%ORA-04020%' THEN
           ROLLBACK;

           BEGIN 
              ..logic to reprocess file..
           END;

        PKG_ERROR_UTIL.write_error_log_p (
           'my_package',
           'my_procedure',
           1,
           SQLCODE,
           DBMS_UTILITY.FORMAT_ERROR_STACK() || CHR(10) || 'Error_Backtrace...' || CHR(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() || ' - File: ' || in_file_name || ' - Action: file_status updated to N to reprocess.',
           NULL);
        ELSE
           ..log other errors..
        END IF;
   END;

如果没有异常发生,该文件将处理并标记为已成功处理。

我偶尔遇到的问题(与我们得到的死锁数量相比)是不行的。即使文件导致死锁,也不会发生重新处理文件的逻辑。而是将文件标记为已完成。

这是错误堆栈:

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00222: error received from SAX callback function
ORA-04020: deadlock detected while trying to lock object my_user.my_table

Error_Backtrace...
ORA-06512: at "SYS.DBMS_XMLSTORE", line 78
ORA-06512: at "SYS.DBMS_XMLSTORE", line 88
ORA-06512: at "my_user.my_package", line 1000
 - File: my_file.xml - Action: file_status updated to N to reprocess.

仅当file_statusN(新)时,才会重新处理该文件,但会将其标记为已完成。

当我说IF SQLERRM LIKE '%ORA-04020%'时,我没有正确捕捉死锁错误吗?

1 个答案:

答案 0 :(得分:0)

请参阅an example from the documention

DECLARE
  deadlock_detected EXCEPTION;
  PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
  ...
EXCEPTION
  WHEN deadlock_detected THEN
    ...
END;
/

顺便说一句:
  ORA-04020 表示:在尝试锁定对象stringstringstringstringstring时检测到死锁 ORA-00060 :表示:在等待资源时检测到死锁
请检入ORA错误代码列表here
以上示例适用于ORA-00060死锁。