我在Mysql 5.5版中实现了一个典型的“审计日志”触发器。我使用 AFTER INSERT 将表 user 中插入的行复制到我的'audit_log'表中。
所以对于这个序列:
BEGIN;
insert into user (name) values ('joe');
<--trigger fires, adds new row to audit_log table-->
COMMIT;
然后我在'audit_log'中使用'joe'获得一个新行。大。
但是,即使触发触发器的插入被其封闭事务中止,似乎也会应用触发器的结果。
所以对于这个序列:
BEGIN;
insert into user (name) values ('mary');
<--trigger fires, adds new row to audit_log table-->
ROLLBACK;
我仍然在audit_log中得到一个新的行'mary',它指的是从未提交到我的用户表的数据。这似乎显然是错误的。
似乎在Postgres中执行的触发器更新在原始事务中执行,这是我期望发生的事情。任何人都有MySQL的经验吗?也许有一个我错了的设置?
我注意到this question表示所有更新都发生在原始事务中。但是,答案是关于触发器的Mysql手册页,实际上根本没有提到“transation”。
答案 0 :(得分:3)
原来我的审计表使用了MyISAM引擎,这当然阻止它正确地遵守交易。
我的同事说我欠Larry Ellison道歉。
拉里,对不起,我怀疑Mysql的事务语义。