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。私の貧しい私の英語で申し訳ありません:)
任意のトリガー? – Rene
はい、申し訳ありません。私は私の質問を編集しました。 – menghi