1
CREATE TABLE t1 (
     t1pk NUMBER PRIMARY KEY NOT NULL
    ,t1val NUMBER
);
CREATE TABLE t2 (
     t2pk NUMBER PRIMARY KEY NOT NULL
    ,t2fk NUMBER
    ,t2val NUMBER
    ,CONSTRAINT t2fk FOREIGN KEY (t2fk)
        REFERENCES t1 (t1pk) ON DELETE CASCADE
);

INSERT INTO t1 (t1pk, t1val)
VALUES (1, 1);

INSERT INTO t2 (t2pk, t2fk, t2val)
VALUES (1, 1, 1);

COMMIT;

CREATE SEQUENCE seq1
    MINVALUE 1
    MAXVALUE 999999999999999999999999999;

CREATE OR REPLACE TRIGGER trg1
BEFORE
INSERT -- Problematic code.
OR UPDATE
OR DELETE ON t1
FOR EACH ROW
BEGIN
    IF (INSERTING)
    THEN
        -- Problematic code.
        :NEW.t1pk := seq1.NEXTVAL;
    END IF;
END trg1;
/

第 1 节:

UPDATE t2 -- Table 2!
SET t2val = t2val;

第 2 节:

UPDATE t1 -- Table 1!
SET t1val = t1val;

在会话 2 中,更新不会返回并一直等到会话 1 通过提交或回滚关闭事务。这不是我所期望的。原因似乎是从序列中生成 pk 的触发代码。如果我删除该序列代码,则会话 2 中的更新不会等待并在会话 1 的事务仍处于打开状态时返回。怎么了?

Oracle Database 11g 企业版 11.2.0.3.0 - 64 位生产

4

0 回答 0