1. 事务与会话
在探讨当前 MySQL 事务在会话中途结束后会发生什么情况前,需要先了解两个重要的概念:事务和会话。
事务是指一系列的数据库操作语句,这些操作要么全部成功执行并提交,要么全部失败并撤销。在 MySQL 中,事务是按照 ACID(原子性、一致性、隔离性、持久性) 原则来管理的。
会话是指客户端与 MySQL 服务器之间的连接,它可以包含一个或多个事务。在会话期间,客户端可以执行多次查询操作,每个查询都可以包含一个或多个事务。
任何一个会话都可以随时启动一个事务,并在事务中执行一系列的 SQL 语句。因此,在会话结束之前,事务可能已经成功提交或者被回滚。
2. 会话中途结束会发生什么?
当会话在事务中途结束时,情况会比较复杂,需要分为两种情况来讨论:
2.1 非持久性存储引擎
如果使用的是非持久性存储引擎,比如 MEMORY 引擎,那么会话结束时,无论事务是否提交,所有的操作都将被清空。这是因为非持久性存储引擎将数据存储在内存中,一旦会话结束,所有的数据都将消失。
例如,下面的代码中,我们创建了一个 MEMORY 表,并向其中插入了一条数据:
CREATE TABLE memory_table (
id INT(11),
name VARCHAR(50)
) ENGINE=MEMORY;
INSERT INTO memory_table (id, name) VALUES (1, 'foo');
接着,我们启动一个事务,并更新该表中的数据:
START TRANSACTION;
UPDATE memory_table SET name = 'bar' WHERE id = 1;
此时,如果会话突然中断或者崩溃,那么所有的更改都会被丢弃。这是因为 MEMORY 引擎不会将更改写入磁盘,因此在会话结束之后,所有的数据都将丢失。
2.2 持久性存储引擎
对于使用持久性存储引擎的情况,比如 InnoDB 引擎,情况会更加复杂。当会话在事务中途结束时,InnoDB 存储引擎会按照以下规则来处理:
如果事务已经提交,那么对数据库的更改将会保留。
如果事务还没有提交,并且对数据库进行了更改,那么这些更改将全部被回滚。
如果事务还没有提交,并且没有进行任何更改,那么当前会话没有对数据库造成任何影响。
例如,下面的代码中,我们创建了一个 InnoDB 表,并向其中插入了一条数据:
CREATE TABLE innodb_table (
id INT(11),
name VARCHAR(50)
) ENGINE=InnoDB;
INSERT INTO innodb_table (id, name) VALUES (1, 'foo');
接着,我们启动一个事务,并更新该表中的数据:
START TRANSACTION;
UPDATE innodb_table SET name = 'bar' WHERE id = 1;
此时,如果会话突然中断或者崩溃,InnoDB 存储引擎会按照上述规则进行处理。如果更新事务已经提交,那么对数据库的更改将会保留。否则,所有的更改都将被回滚。
需要注意的是,对于 InnoDB 存储引擎来说,会话的结束并不等于事务的结束。即使当前的会话已经结束,事务仍然可以继续执行。如果在会话结束之前启动的事务还没有提交,那么它仍然可以在下一个会话中继续执行。
3. 总结
在 MySQL 中,会话和事务是两个重要的概念。当会话在事务中途结束时,会根据存储引擎的不同来处理。对于非持久性存储引擎来说,所有的更改都将被清空;对于 InnoDB 存储引擎来说,如果更新事务已经提交,那么对数据库的更改将会保留,否则所有的更改都将被回滚。需要注意的是,会话的结束并不等于事务的结束,在会话结束之前启动的事务仍然可以在下一个会话中继续执行。