我在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”。
最佳答案
事实证明我的审计表使用的是 MyISAM 引擎,这当然阻止了它正确遵守事务。
我的同事说我欠拉里·埃里森一个道歉。
Larry,很抱歉我怀疑 Mysql 的事务语义。
关于原始事务回滚后Mysql触发器插入持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669292/