回滚原始事务后,Mysql触发器插入保持不变

时间:2013-03-27 20:55:57

标签: mysql triggers transactions

我在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”。

1 个答案:

答案 0 :(得分:3)

原来我的审计表使用了MyISAM引擎,这当然阻止它正确地遵守交易。

我的同事说我欠Larry Ellison道歉。

拉里,对不起,我怀疑Mysql的事务语义。