【问题标题】:Can multiple updates in one MySQL query emulate transaction behavior?一个 MySQL 查询中的多个更新可以模拟事务行为吗?
【发布时间】:2014-09-26 13:46:32
【问题描述】:

我正在使用 MySQL MyISAM,这无法更改。但是,我只熟悉事务方法。由于 MyISAM 不支持事务,我正在考虑将两个更新查询合并为一个,如下所示:

UPDATE table1, table2 SET table1.col1='value1', table2.col1='value2'
WHERE table1.col3='567' AND table2.col6='876'

这是否保证如果任何子查询失败,另一个子查询也不会被执行并且查询将返回 FALSE?

为了测试这一点,我故意用无效的字段名称替换了表 1 和表 2 的有效字段名称。在这两种情况下,phpMyAdmin 都返回错误并且没有执行任何查询。

如果出现任何其他查询错误,是否会观察到这种行为?

【问题讨论】:

  • 它不保证任何远程类似于交易。无论您尝试使用什么,都不会调用操作系统的fsync 调用或强制fsync,无论您如何尝试编写该查询。因此,根据定义 - 不,它不会模拟交易行为。你不能与 MyISAM 进行交易,你不能模仿它,你不能把它挤出来。你可以尝试加锁等等,但不会是这样。

标签: mysql myisam


【解决方案1】:

您只能依赖在第一个错误引发后未执行的任何内容(这些错误通常不在程序员而是在数据库级别,因此难以预测)。那时已写入数据库的任何内容不会回滚(毕竟,您使用的是不支持该功能的 MyISAM 表)。

这不是您想听到的答案,但如果您想要可预测且可靠的事务行为,唯一的方法就是使用支持它们的引擎(例如 InnoDB)。

【讨论】:

  • 我明白了。看来我必须探索“锁定表”的方法。
猜你喜欢
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多