Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 检测到死锁,但可以';我认不出来_Oracle_Plsql_Deadlock - Fatal编程技术网

Oracle 检测到死锁,但可以';我认不出来

Oracle 检测到死锁,但可以';我认不出来,oracle,plsql,deadlock,Oracle,Plsql,Deadlock,我在Oracle数据库中检测到ORA-00060死锁,我正试图找出是什么触发了这个死锁 在跟踪文件中,我得到了以下信息: Deadlock graph: ---------Blocker(s)-------- --------- Waiter(s)--------- Resource Name process session holds waits proce

我在Oracle数据库中检测到ORA-00060死锁,我正试图找出是什么触发了这个死锁

在跟踪文件中,我得到了以下信息:

Deadlock graph:
                                      ---------Blocker(s)--------  ---------
Waiter(s)---------
Resource Name                             process session holds waits  
process session holds waits
TM-00018269-00000000-00000000-00000000         79     428    SX             81      73    SX   SSX
TM-000285FE-00000000-00000000-00000000         81      73    SX             79     428    SX   SSX

session 428: DID 0001-004F-000011C8     session 73: DID 0001-0051-00000293
session 73: DID 0001-0051-00000293      session 428: DID 0001-004F-000011C8

Rows waited on:
  Session 428: no row
  Session 73: no row
通过搜索,我在Arup Nanda上找到了这篇文章:

这似乎是一个外键相关的死锁

但我检查了我所有的桌子和外键,没有发现任何东西

“当前SQL”字段为:

更新CL_PEDIDOLINEA集合IDPEDIDOESTADO=:B2,其中ID=:B1

该表的结构如下:

TABLE CL_PEDIDOLINEA
(
  ID                      NUMBER,
  IDPEDIDO                NUMBER                NOT NULL,
  IDPEDIDOESTADO          NUMBER                NOT NULL,
  IDPEDIDOLINEAORIGEN     NUMBER,
  IDPRODUCTOREFERENCIA    NUMBER                NOT NULL,
  IDDIRECCION             NUMBER                NOT NULL,
  FECHALIMITE             DATE,
  FECHACOMPLETADO         DATE,
  FECHAANULADO            DATE,
  EAN                     NUMBER                NOT NULL,
  REFERENCIA              VARCHAR2(32 BYTE)     NOT NULL,
  NOMBRE                  VARCHAR2(1024 BYTE)   NOT NULL,
  CANTIDAD                NUMBER                DEFAULT 0                     NOT NULL,
  PRECIO                  NUMBER(22,4)          DEFAULT 0                     NOT NULL,
  DTO                     NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  PRECIODTO               NUMBER(22,4)          DEFAULT 0                     NOT NULL,
  IDIMPUESTO              NUMBER                NOT NULL,
  TASAIMPUESTO            NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  CUOTAIMPUESTO           NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  TASARECARGO             NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  CUOTARECARGO            NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  IDIMPUESTO_GASTOSENVIO  NUMBER,
  TASAGASTOSENVIO         NUMBER(22,2)          DEFAULT 0,
  CUOTAGASTOSENVIO        NUMBER(22,2)          DEFAULT 0,
  SUBTOTAL                NUMBER(22,2)          DEFAULT 0                     NOT NULL,
  OBS_PRODUCCION          VARCHAR2(4000 BYTE),
  OBS_PREPRODUCCION       VARCHAR2(4000 BYTE)
)
触发因素:

CREATE OR REPLACE TRIGGER BIU_CL_PEDIDOLINEA
BEFORE INSERT OR UPDATE
ON CL_PEDIDOLINEA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
    l_id          NUMBER;
    l_ean         NUMBER;
    l_nombre      VARCHAR2(512);
    l_referencia    VARCHAR2(32);
BEGIN
    IF INSERTING
    THEN
        SELECT pr.EAN, p.NOMBRE, pr.REFERENCIA INTO l_ean, l_nombre, l_referencia 
        FROM CL_PRODUCTOREFERENCIA pr 
        JOIN CL_PRODUCTO p ON p.ID = pr.IDPRODUCTO 
        WHERE pr.ID = :new.idproductoreferencia;

        IF :new.id IS NULL THEN l_id := cl_pedidolinea_seq.nextval; END IF;
        :new.id              := nvl(:new.id, l_id);
        :new.idpedidoestado := NVL(:new.idpedidoestado, 11); /* Alta Pedido */

        :new.ean := NVL(:new.ean, l_ean);
        :new.nombre := NVL(:new.nombre, l_nombre);
        :new.referencia := NVL(:new.referencia, l_referencia);
    END IF;

    IF (INSERTING OR UPDATING)
    THEN
        :new.preciodto      := :new.precio - ((:new.dto / 100) * :new.precio);
        :new.subtotal       := :new.cantidad * :new.preciodto;
        :new.cuotaimpuesto  := :new.subtotal * (:new.tasaimpuesto / 100);
        :new.cuotarecargo   := :new.subtotal * (:new.tasarecargo / 100);
    END IF;
END;
/
指数:

CREATE INDEX IDDIRECCION ON CL_PEDIDOLINEA
(IDDIRECCION)
LOGGING
TABLESPACE CLOUDIA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE INDEX IDPEDIDO ON CL_PEDIDOLINEA
(IDPEDIDO)
LOGGING
TABLESPACE CLOUDIA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE INDEX IDPEDIDOESTADO ON CL_PEDIDOLINEA
(IDPEDIDOESTADO)
LOGGING
TABLESPACE CLOUDIA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE INDEX IDPEDIDOLINEAORIGEN ON CL_PEDIDOLINEA
(IDPEDIDOLINEAORIGEN)
LOGGING
TABLESPACE CLOUDIA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE INDEX IDPRODUCTOREFERENCIA ON CL_PEDIDOLINEA
(IDPRODUCTOREFERENCIA)
LOGGING
TABLESPACE CLOUDIA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );
限制条件:

ALTER TABLE CL_PEDIDOLINEA ADD (
  CONSTRAINT CL_PEDIDOLINEA_PK
  PRIMARY KEY
  (ID)
  USING INDEX CL_PEDIDOLINEA_PK
  ENABLE VALIDATE);

ALTER TABLE CL_PEDIDOLINEA ADD (
  CONSTRAINT CL_PEDIDOLINEA_R01 
  FOREIGN KEY (IDPEDIDO) 
  REFERENCES CL_PEDIDO (ID)
  ENABLE VALIDATE,
  CONSTRAINT CL_PEDIDOLINEA_R02 
  FOREIGN KEY (IDPEDIDOESTADO) 
  REFERENCES CL_PEDIDOLINEAESTADO (ID)
  ENABLE VALIDATE,
  CONSTRAINT CL_PEDIDOLINEA_R03 
  FOREIGN KEY (IDPRODUCTOREFERENCIA) 
  REFERENCES CL_PRODUCTOREFERENCIA (ID)
  ENABLE VALIDATE,
  CONSTRAINT CL_PEDIDOLINEA_R04 
  FOREIGN KEY (IDPEDIDOLINEAORIGEN) 
  REFERENCES CL_PEDIDOLINEA (ID)
  ENABLE VALIDATE,
  CONSTRAINT CL_PEDIDOLINEA_R05 
  FOREIGN KEY (IDDIRECCION) 
  REFERENCES CL_TERCERODIRECCION (ID)
  ENABLE VALIDATE,
  CONSTRAINT CL_PEDIDOLINEA_R06 
  FOREIGN KEY (IDIMPUESTO_GASTOSENVIO) 
  REFERENCES CL_IMPUESTO (ID)
  ENABLE VALIDATE);
所有相关的受约束表字段都有索引

我不知道我怎么知道是什么导致了僵局

你能帮我吗

提前谢谢


顺便说一句,很抱歉我的英语很差:)

原因之一可能是外键未编入索引

运行此脚本以检查:

select cc.owner, cc.table_name, cc.column_name, cc.position   
from dba_cons_columns cc
where 
 cc.owner not in ('SYS','SYSTEM')
 and position is not null
minus
select i.index_owner, i.table_name, i.column_name, i.column_position
from dba_ind_columns i
where 
 i.index_owner not in ('SYS','SYSTEM');

桌子上有触发器吗?是的,对不起。我已经编辑了我的问题。非常感谢你,@sandman!有一些未编入索引的FK。我将观察日志,以了解未来的死锁,但目前一切正常!!再次感谢你!很荣幸,蒙吉:)