2017-07-17 6 views
0

Ich bekomme ORA-00060 Deadlock in unserer Oracle-Datenbank erkannt und ich versuche herauszufinden, was dies auslöst.Deadlock erkannt, aber kann es nicht identifizieren

In der Trace-Datei ich das bekam: scheint http://arup.blogspot.com.es/2013/04/application-design-is-only-reason-for.html

und es ist ein Fremdschlüssel im Zusammenhang Sackgasse zu sein:

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 

darüber Suchen, habe ich diesen Artikel von Arup Nanda gefunden.

Aber ich habe alle meine Tabellen und Fremdschlüssel überprüft und ich habe nichts gefunden.

Die "Current SQL" Feld ist:

UPDATE CL_PEDIDOLINEA SET IDPEDIDOESTADO =: B2 WHERE ID =: B1

Diese Tabelle hat die folgende Struktur:

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) 
) 

Trigger:

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; 
/

Indizes:

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 
      ); 

Constraints:

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); 

und alle damit verbundenen eingeschränkten Tabellen Felder Indizes.

Ich weiß nicht, wie ich herausfinden kann, was die Deadlocks feuert.

Können Sie mir helfen?

Vielen Dank im Voraus.

Ps. Entschuldigung durch mein schlechtes Englisch :)

+0

Triggern auf dem Tisch? – Rene

+0

Ja, tut mir leid. Ich habe meine Frage bearbeitet. – menghi

Antwort

0

Einer der Gründe könnte Un-indizierte Fremdschlüssel sein.

Führen Sie dieses Skript zu überprüfen:

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'); 
+0

Vielen Dank, @sandman! Es gab ein paar nicht indizierte FKs. Ich werde die Protokolle für zukünftige Deadlocks beobachten, aber im Moment funktioniert alles gut !! Danke nochmal! – menghi

+0

es ist ein Vergnügen menghi :) – sandman

Verwandte Themen