【发布时间】:2013-03-27 20:55:56
【问题描述】:
我在 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手册页上的触发器,实际上根本没有提到“事务”。
【问题讨论】:
-
我刚刚在 MySQL 5.5 中做了一个快速测试,触发器似乎已经回滚了。你用的是什么版本的 MySQL?
-
mysql 通常支持事务中的触发器。见stackoverflow.com/questions/13823165/…
-
嗯..我当然不会试图避免交易。我会尝试创建一个更有限的测试用例。
-
哈哈,我可以在原帖中隐藏我的名字吗?我正在用触发器写入 MyISAM 表。坚持使用 InnoDB,一切都很好。
标签: mysql triggers transactions