MySQL - 当UPDATE命令被中断时会发生什么?

时间:2013-08-11 04:21:34

标签: mysql transactions sql-update interrupt

我通过My​​SQL命令行客户端发出了一个长时间运行的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表。

3 个答案:

答案 0 :(得分:6)

FOR INNODB: Mysql手册说InnoDB交易存储引擎)提供完整 ACID < / i>抱怨。因此,它将立即完成所有操作,或者在中断的情况下不执行操作和回滚。 这是MySQL 5.5及以上的默认引擎。

  

MySQL包含与ACID模型紧密相关的InnoDB存储引擎等组件,因此数据不会损坏,并且不会因软件崩溃和硬件故障等特殊情况而导致结果失真。

FOR MYISAM 但适用于非交易MyISAM存储引擎。这样的存储引擎遵循一种模型,其中数据一次写入一个语句。这是使用原子操作完成的。因此,如果你中断了这个过程,那么你就会把它弄到一定程度,直到你被打断为止。

  

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

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

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

答案 1 :(得分:1)

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

在之前的版本中遇到了一个错误,其中没有发生错误:http://bugs.mysql.com/bug.php?id=45923

this question关于autocommit on作为全局var的区别,与使用START TRANSACTION / COMMIT行为相比,您可以了解更多有关最佳实践的信息。

答案 2 :(得分:-1)

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