2

我在 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 手册页,实际上根本没有提到“事务”。

4

1 回答 1

3

原来我的审计表正在使用 MyISAM 引擎,这当然会阻止它正确地遵守事务。

我的同事说我欠拉里·埃里森一个道歉。

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

于 2013-03-28T23:01:08.467 回答