原始事务回滚后Mysql触发器插入持久化

标签 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”。

最佳答案

事实证明我的审计表使用的是 MyISAM 引擎,这当然阻止了它正确遵守事务。

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

Larry,很抱歉我怀疑 Mysql 的事务语义。

关于原始事务回滚后Mysql触发器插入持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669292/

相关文章:

php - 使用Jquery与数据库进行验证

php - 像 stackoverflow 这样的 SQL 搜索查询

MySQL查询 - 获取由另一列过滤的最高数字的行

PHP wamp 服务器错误

php - 我是否需要事务来获取序列中最后插入的正确 ID?

postgresql - 在一个表中插入会先自动插入到另一个表中(PostgreSQL)

mysql - 使用 NOW 更新 MYSQL 上的列无法正常工作

mysql - 级联删除时触发调用

tsql - 如何取消/重置 SQL Server 的事务隔离级别?

transactions - 三阶段提交协议(protocol)(3PC)如何保证原子性?