2017-07-17 21 views
0

ORA-00060 Oracleデータベースでデッドロックが検出されましたが、何が起きているのか把握しようとしています。私はこれを得たトレースファイルに デッドロックが検出されましたが、それを特定できません

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 

それについての検索は、私はアラップナンダから、この記事を見つけた: http://arup.blogspot.com.es/2013/04/application-design-is-only-reason-for.html

、外部キー関連のデッドロックのようです。

しかし、私はすべてのテーブルと外部キーをチェックして、何も見つかりませんでした。

"現在SQL" フィールドである:

UPDATE CL_PEDIDOLINEA SET IDPEDIDOESTADO = B2 WHERE 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); 

および関連するすべての制約テーブルフィールドには、インデックスを持っています。

私はどのようにデッドロックを発射しているのか分かりません。

お手伝いできますか?

ありがとうございます。

ps。私の貧しい私の英語で申し訳ありません:)

+0

任意のトリガー? – Rene

+0

はい、申し訳ありません。私は私の質問を編集しました。 – menghi

答えて

0

インデックスのない外部キーが原因の1つになる可能性があります。

を実行し、このスクリプトをチェックする:テーブルの上に

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

ありがとう、@サンドマン!索引付けされていないFKがいくつかありました。私は将来のデッドロックのログを見ますが、現時点ではすべて正常に動作しています!ありがとうございました! – menghi

+0

それは嬉しいmenghi :) – sandman

関連する問題