Использовался IBExpert, FB 2.0.12748-win32 на win2003
Имеем две таблицы (приведу скрипт так, как его показывает ibexpert за искл. комментариев, возможно, что это важно):
Первая таблица:
Код: Выделить всё
SET SQL DIALECT 3;
CREATE GENERATOR GEN_MAIN_ID;
CREATE TABLE MAIN (
ID INTEGER NOT NULL,
BALANCE DECIMAL(15,2) DEFAULT 0.00 NOT NULL
);
ALTER TABLE MAIN ADD CONSTRAINT PK_MAIN PRIMARY KEY (ID);
SET TERM ^ ;
/* Trigger: MAIN_BI */
CREATE TRIGGER MAIN_BI FOR MAIN
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_MAIN_ID,1);
END
^
SET TERM ; ^
Код: Выделить всё
SET SQL DIALECT 3;
CREATE GENERATOR GEN_PAYMENTS_ID;
CREATE TABLE PAYMENTS (
ID INTEGER NOT NULL,
ID_MAIN INTEGER NOT NULL,
MONEY DECIMAL(15,2) NOT NULL
);
ALTER TABLE PAYMENTS ADD CONSTRAINT PK_PAYMENTS PRIMARY KEY (ID);
ALTER TABLE PAYMENTS ADD CONSTRAINT FK_PAYMENTS_1 FOREIGN KEY (ID_MAIN) REFERENCES MAIN (ID) ON DELETE CASCADE ON UPDATE CASCADE;
SET TERM ^ ;
/* Trigger: PAYMENTS_BI */
CREATE TRIGGER PAYMENTS_BI FOR PAYMENTS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_PAYMENTS_ID,1);
END
^
SET TERM ; ^
Код: Выделить всё
INSERT INTO MAIN (ID, BALANCE) VALUES (1, 2325);
В PAYMENTS добавляем одну запись:
Код: Выделить всё
INSERT INTO PAYMENTS (ID, ID_MAIN, MONEY) VALUES (1, 1, 200);
Теперь начинаем транзакцию и обновляем баланс
Код: Выделить всё
update main set balance = balance + 120 where id = 1
Начинаем другую транзакцию (в другом или этом же коннекте) и делаем
Код: Выделить всё
update payments set money = 0 where id_main = 1
Код: Выделить всё
insert into payments (id_main, money) values (1, 0)
Код: Выделить всё
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
lock conflict on no wait transaction.
violation of FOREIGN KEY constraint "FK_PAYMENTS_1" on table "PAYMENTS".
Foreign key reference target does not exist.