现有表TAB,其中字段 A(年月),B(行政区划),C(rownum),D
表数据量很大,一个月大约数据为1000W左右,所以考虑分并发处理
即把每月,单行政区划(B)按数据量大小分成若干个子任务进行,
并发的分离由C决定,即用C的行号来确定其属于某个子任务,处理即更行D字段
在更新之前先把D按子任务UPDATE为空,此处报死锁,已确定rownum分并发并无重复,
且死锁为多行政区划互相产生,bitmap索引已重建为普通索引,仍无法解决
怀疑为资源不足导致次问题发生死锁SQL如下UPDATE TAB@DB   set D= '' WHERE A= 201108   AND B= TO_CHAR(510107)   AND C>= 1 AND C<= 131072错误报告如下:
ORA-00060: deadlock detected while waiting for resource
ORA-02063: preceding line from DB   ORA-06512: at "PKG_ETL", line 2409ORA-02049: timeout: distributed transaction waiting for lock
ORA-02063: preceding line from DB   ORA-06512: at "PKG_ETL", line 24092409行即EXCUTE该SQL,求各位大神帮忙分析下,非常感谢

解决方案 »

  1.   

    死锁是由于两个SESSION之间互相等待锁资源而产生的,你需要查看下死锁生成的trace文件,看两个SESSION分别执行了哪些SQL引起错误,然后看这些SQL更改的数据是否重合。
      

  2.   

    trace 文件确定SQL无重复,怀疑update快锁造成的
      

  3.   

    检查DBLINK远端数据库是否有SESSION在锁表:
    select OBJECT_ID from dba_objects where object_name='TAB');
    SELECT * FROM DBA_BLOCKERS;
    确认没有bitmap索引。
    确认并发进程更改的数据没有重合。
    单个进程执行是否正常?