【问题标题】:Mysql trigger inserts persist after original transaction is rolled back回滚原始事务后,Mysql触发器插入仍然存在
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2013-01-08
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多