我们在处理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_status
为N
(新)时,才会重新处理该文件,但会将其标记为已完成。
当我说IF SQLERRM LIKE '%ORA-04020%'
时,我没有正确捕捉死锁错误吗?
答案 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死锁。