我通过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表。
答案 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查询是“原子的”,这意味着您的数据库应该看起来好像您的查询从未运行过