数据库在执行触发器之前关闭会发生什么?

时间:2015-10-26 04:43:24

标签: sql database postgresql

假设我在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)

将会发生什么:

  1. beforeinsert运行DoSomething2()

  2. 该行已插入A

  3. afterinsert运行DoSomething1()

  4. 我的问题是如果数据库关闭2到3之间会发生什么? 当它再次开始时......会有什么好处?它会回滚插入的行并回滚beforeinsert触发器吗?

    基本上我只是不明白在这种情况下被认为是原子操作。它是Insert +触发器还是只是行?

2 个答案:

答案 0 :(得分:3)

触发器是交易的一部分,在它们完成运行之前它不会提交。如果数据库在事务提交之前关闭,则它将被回滚。回滚会影响在事务中进行的所有更改,包括触发器所做的更改。

答案 1 :(得分:0)

如果执行软关闭(即告诉数据库关闭:pg_ctl -m fast),它将回滚所有打开的事务。这包括到目前为止任何触发器所做的所有更改。

如果您终止数据库(如kill -9),则数据库无法正确提交或回滚所有内容。下次启动数据库时,它将运行恢复并将所有更改回滚到上次成功提交的时间点。

所有触发器都是正在进行的事务的一部分,所有更改仅在所有AFTER触发器完成后才会提交。