假设我在PostgreSQL中有如下表:
CREATE TABLE A
(
userid integer,
productid integer,
description citext,
price numeric
)
及其上的一些触发器:
CREATE TRIGGER afterinsert
AFTER INSERT
ON A
FOR EACH ROW
EXECUTE PROCEDURE DoSomething1();
CREATE TRIGGER beforeinsert
BEFORE INSERT
ON A
FOR EACH ROW
EXECUTE PROCEDURE DoSomething2();
现在,如果我这样做:
Insert into A values (1,3,'some description',100.5)
将会发生什么:
beforeinsert
运行DoSomething2()
该行已插入A
afterinsert
运行DoSomething1()
我的问题是如果数据库关闭2到3之间会发生什么?
当它再次开始时......会有什么好处?它会回滚插入的行并回滚beforeinsert
触发器吗?
基本上我只是不明白在这种情况下被认为是原子操作。它是Insert +触发器还是只是行?
答案 0 :(得分:3)
触发器是交易的一部分,在它们完成运行之前它不会提交。如果数据库在事务提交之前关闭,则它将被回滚。回滚会影响在事务中进行的所有更改,包括触发器所做的更改。
答案 1 :(得分:0)
如果执行软关闭(即告诉数据库关闭:pg_ctl -m fast),它将回滚所有打开的事务。这包括到目前为止任何触发器所做的所有更改。
如果您终止数据库(如kill -9),则数据库无法正确提交或回滚所有内容。下次启动数据库时,它将运行恢复并将所有更改回滚到上次成功提交的时间点。
所有触发器都是正在进行的事务的一部分,所有更改仅在所有AFTER触发器完成后才会提交。