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

aru*_*run 3 mysql transactions interrupt sql-update

我通过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> 
Run Code Online (Sandbox Code Playgroud)

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

woo*_*eow 6

对于INNODB: Mysql手册说InnoDB(事务存储引擎)提供完整的 ACID抱怨.因此,它将立即完成所有操作,或者在中断的情况下不执行操作和回滚.这是MySQL 5.5及以上版本的默认引擎.

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

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

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

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

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

  • 很棒的答案,打败了它:)还要说'autocommit`是一个重要的因素在这里,这个热门问题很好地解决了一个常见的混乱来源:自动提交启用与显式START TRANSACTION和COMMIT/ROLLBACK:http ://stackoverflow.com/questions/2950676/difference-between-set-autocommit-1-and-start-transaction-in-mysql-have-i-misse (2认同)