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 Enterprise Edition, выпуск 11.2.0.3.0 - 64-разрядная версия