5

我通过 MySQL 命令行客户端发出了一个长时间运行的 UPDATE 查询(一个不正确的查询),并Ctrl-C在几秒钟后停止了它。该命令尚未完成运行。我的数据库是否会针对某些条目进行更新,或者是否会在事务中发生并且所有内容都会回滚?

mysql> <LONG RUNNING INCORRECT UPDATE STATEMENT>
^CCtrl-C -- sending "KILL QUERY 12088743" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
mysql> 

更新:查询中涉及的所有表都是 InnoDB 表。

4

3 回答 3

9

FOR INNODB: Mysql 手册说InnoDB事务存储引擎)提供了完整的 ACID投诉。因此,它会立即完成所有操作,或者在中断的情况下不会执行操作并回滚。这是 MySQL 5.5 及更高版本的默认引擎。

MySQL 包含 InnoDB 存储引擎等组件,这些组件与 ACID 模型密切相关,因此数据不会因软件崩溃和硬件故障等异常情况而损坏,结果也不会失真。

FOR MYISAM:但是对于非事务性MyISAM的存储引擎。这种存储引擎遵循一个模型,数据一次写入一个语句。这是使用原子操作完成的。因此,如果您中断该过程,那么您将直截了当,直到您中断为止。

MySQL 服务器中的非事务性存储引擎(例如 MyISAM)遵循不同的数据完整性范式,称为“原子操作”。MyISAM 表有效地始终在 autocommit = 1 模式下运行。由于更改的数据一次写入一个语句到磁盘,因此很难保证一系列相关 DML 操作的一致性,这些操作可能会在中途中断。因此,此模式适用于以读取为主的工作负载。在事务方面,当每个特定更新都在运行时,没有其他用户可以干预它,永远不会自动回滚,也没有脏读。

但是,您可以将LOCK TABLES其用作解决方法。这是 MySQL 5.5 之前的默认存储引擎。*

所以答案取决于您使用的存储引擎。希望有帮助:)

于 2013-08-11T04:50:39.937 回答
1

autocommit启用和简单的InnoDb 中,UPDATE它将完全启动回滚。回滚对于 ACID 合规性很重要,但可能是问题的根源,因此仔细使用forced rollback可以缓解这些问题,与没有回滚的问题相比,这些问题很少出现。

在以前的版本中解决了一个错误,它没有发生,因为它应该有:http ://bugs.mysql.com/bug.php?id=45923 。

这个关于 autocommit on as a global var 与利用 START TRANSACTION/COMMIT 行为之间的区别的问题中,您可以了解有关一些最佳实践的更多信息。

于 2013-08-11T04:54:12.570 回答
-1

据我所知,MySQL 查询是“原子的”,这意味着您的数据库应该看起来好像您的查询从未运行过

于 2013-08-11T04:25:30.943 回答