如果会话被 DBA 终止,当前 MySQL 事务会发生什么情况?
mysqlmysqli database更新于 2025/8/10 21:00:17
假设如果会话在事务中间被终止,那么当前 MySQL 事务将被 MySQL 回滚并结束。这意味着当前事务中所做的所有数据库更改都将被删除。当会话被终止时,这被称为隐式回滚。
示例
假设我们在表"marks"中有以下值
mysql> Select * from marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | | 4 | Rahul | History | 40 | | 5 | Yashraj | English | 48 | | 6 | Manak | History | 70 | +------+---------+---------+---------+ 6 rows in set (0.00 sec)
现在我们启动一个新事务并从表"marks"中删除一行
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> Delete from marks where id = 4; Query OK, 1 row affected (0.00 sec)
在 COMMIT 或 ROLLBACK 之前,打开另一个窗口运行另一个 MySQL 实例并运行 SHOW PROCESSLIST 命令,如下所示 −
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:49303 db: query Command: Sleep Time: 22 State: Info: NULL *************************** 2. row *************************** Id: 3 User: root Host: localhost:49350 db: NULL Command: Query Time: 0 State: NULL Info: show processlist 2 rows in set (0.00 sec)
现在,通过运行 KILL 命令终止当前事务,如下所示 −
mysql> KILL 2; Query OK, 0 rows affected (0.00 sec)
现在,当我们返回到当前事务并执行 COMMIT 命令时,如下所示 −
mysql> COMMIT; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 4 Current database: query Query OK, 0 rows affected (1.01 sec)
上述 KILL 命令终止了当前会话,并强制 MySQL 回滚当前事务中所做的更改。从以下查询中可以看出,没有从表‘marks’中删除任何行。
mysql> Select * from marks; +------+---------+-----------+-------+ | Id | Name | Subject | Marks | +------+---------+-----------+-------+ | 1 | Aarav | Maths | 50 | | 1 | Harshit | Maths | 55 | | 3 | Gaurav | Comp | 69 | | 4 | Rahul | History | 40 | | 5 | Yashraj | English | 48 | | 6 | Manak | History | 70 | +------+---------+---------+---------+ 6 rows in set (0.00 sec)
相关文章
有用资源
mysql 参考教程 - 该教程包含有关 mysql 的更多信息:https://www.cainiaomax.com/mysql/

