我在 Mysql 5.5 版中实现了一个典型的“审计日志”触发器。我使用AFTER INSERT将插入的行从表用户复制到我的“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 中有这方面的经验吗?也许有一个设置我错了?
我注意到这个问题意味着所有更新都发生在原始事务中。但是,答案是指关于触发器的 Mysql 手册页,实际上根本没有提到“事务”。