2013-03-27 43 views
1

我在Mysql 5.5版本中实现了一个典型的“审计日志”触发器。我使用AFTER INSERT将表用户的插入行复制到我的'audit_log'表中。在原始事务回滚之后,Mysql触发器插入仍然存在

因此,对于这个顺序:

BEGIN; 
insert into user (name) values ('joe'); 
<--trigger fires, adds new row to audit_log table--> 
COMMIT; 

然后我得到了 'AUDIT_LOG' 与 '乔' 新行。大。

但是,即使触发触发器的插入操作被其封闭事务中止,我的触发器的结果似乎也应用了。

因此,对于这个顺序:

BEGIN; 
insert into user (name) values ('mary'); 
<--trigger fires, adds new row to audit_log table--> 
ROLLBACK; 

我仍然在AUDIT_LOG新行“玛丽”,这指的是从来没有承诺我的用户表中的数据结束了。这似乎很明显是错误的。

看来在Postgres中执行的触发更新在原始事务中执行,这是我期望发生的事情。任何人都有这在MySQL的经验?也许有一个设置我错了?

我注意到this question意味着所有更新都发生在原始事务中。但是,答案指的是触发器上的Mysql手册页,实际上根本没有提到“转换”。

+0

我刚刚在MySQL 5.5中做了一个快速测试,触发器似乎回滚了。你使用的是什么版本的MySQL? – Steve 2013-03-27 21:20:47

+0

mysql通常在事务中支持触发器。请参阅http://stackoverflow.com/questions/13823165/mysql-trigger-with-transaction-insert-or-update – didierc 2013-03-27 21:38:47

+0

嗯..我当然不是在试图避免交易。我会尝试创建一个更有限的测试用例。 – 2013-03-28 22:06:29

回答

2

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

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

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