概述
最近,因为工作的原因,我一直在对MySQL事务处理进行一系列的测试和验证。其中,当MySQL事务生成数据快照时,其结果看起来与薛定谔的猫的概念非常相似,非常有趣。发布流程。有兴趣的朋友可以一起学习。
事务不依赖于虚拟表或辅助表,而是主要依赖于MySQL的InnoDB存储引擎提供的多版本并发控制(MVCC)机制和事务日志记录。
在事务开始时,MySQL 会记录当前事务的快照。这意味着您在事务期间看到的数据是事务开始时的版本,即使其他事务修改了数据。
本文中的所有步骤按照时间线严格相互关联。如果顺序改变,结果也会改变。
假设我有一个这样的表:
登录后复制
# 会话2
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 7 | 5000.00 |
| 8 | 6000.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
5行组(0.0005秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13。
测试1:事务中进行了数据观察
登录后复制
#第1 节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 5行数据。但请不要问!
1.2.3.4.5.6。
登录后复制
# 会话2
# 删除两条数据
MySQL localhost:3306 ssl xiaml SQL 从帐户中删除,其中account_id=7 或account_id=8;
查询正常,2 行受影响(0.0038 秒)
MySQL localhost:3306 ssl xiaml SQL
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
3 行组(0.0009 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15。
登录后复制
#第1 节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 *************3行数据。 **************
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
3 行组(0.00 秒)
mysql
— 至此,快照已经创建完毕。这意味着START TRANSACTION 之后的语句是精确的快照点。
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18。
登录后复制
# 第二节
# 删除其他数据
MySQL localhost:3306 ssl xiaml SQL 从帐户中删除WHERE account_id=9;
查询正常,1 行受影响(0.0038 秒)
MySQL localhost:3306 ssl xiaml SQL
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 10 | 2000.00 |
+–+——–+
2 行组(0.0006 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13.14。
登录后复制
#第1 节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 *************3行数据。 **************
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
3 行组(0.00 秒)
mysql
— 至此,快照已经创建完毕。这意味着START TRANSACTION 之后的语句是精确的快照点。
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
3 行组(0.00 秒)
mysql
— 因为拍了快照,所以事务的时间在该点被冻结,其他会话的更改不会影响冻结的数据。
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30。
只要你仔细观察,从那一刻起树枝的出现就感觉很像薛定谔的猫。
测试1:事务中先不做数据观察
现在我们再做一个实验。启动事务后,您不进行任何数据操作甚至查询,只需定义变量,在另一个会话中删除数据,并观察删除是否在事务中创建分支。
登录后复制
#第1 节
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 7 | 5000.00 |
| 8 | 6000.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
5 行组(0.0009 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13。
登录后复制
#第二节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 5行数据。但请不要问!
— 删除不同会话中的两条数据
1.2.3.4.5.6.7。
登录后复制
#第1 节
# 删除两条数据
MySQL localhost:3306 ssl xiaml SQL 从帐户中删除,其中account_id=7 或account_id=8;
查询正常,2 行受影响(0.0044 秒)
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 9 | 1000.00 |
| 10 | 2000.00 |
+–+——–+
3 行组(0.0015 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13.14。
登录后复制
#第二节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 5行数据。但请不要问!
— 删除不同会话中的两条数据
mysql SET @name :=\’xiamingliang\’;
查询正常,0 行受影响(0.00 秒)
mysql
— 仅在事务内创建变量,不对数据执行任何形式的查询或修改。
— 在另一个会话中多删除一条数据
1.2.3.4.5.6.7.8.9.10.11.12。
登录后复制
#第1 节
# 删除其他数据
MySQL localhost:3306 ssl xiaml SQL DELETE FROM account WHERE account_id=9;
查询正常,1 行受影响(0.0028 秒)
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 10 | 2000.00 |
+–+——–+
2 行组(0.0005 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12.13。
登录后复制
#第二节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 5行数据。但请不要问!
— 删除不同会话中的两条数据
mysql SET @name :=\’xiamingliang\’;
查询正常,0 行受影响(0.00 秒)
mysql
— 仅在事务内创建变量,不对数据执行任何形式的查询或修改。
— 在另一个会话中多删除一条数据
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 10 | 2000.00 |
+–+——–+
2 行组(0.00 秒)
mysql
— 在另一个会话中多删除一条数据
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23。
登录后复制
#第1 节
# 删除其他数据
MySQL localhost:3306 ssl xiaml SQL DELETE FROM account WHERE account_id=10;
查询正常,1 行受影响(0.0037 秒)
MySQL localhost:3306 ssl xiaml SQL select * from account;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
+–+——–+
一组1 行(0.0013 秒)
MySQL localhost:3306 ssl xiaml SQL
1.2.3.4.5.6.7.8.9.10.11.12。
登录后复制
#第二节
启动mysql 事务。
查询正常,0 行受影响(0.00 秒)
mysql
— 此时没有创建事务快照。数据与实际表格完美匹配。 5行数据。但请不要问!
— 删除不同会话中的两条数据
mysql SET @name :=\’xiamingliang\’;
查询正常,0 行受影响(0.00 秒)
mysql
— 仅在事务内创建变量,不对数据执行任何形式的查询或修改。
— 在另一个会话中多删除一条数据
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 10 | 2000.00 |
+–+——–+
2 行组(0.00 秒)
mysql
— 在不同的会话中删除不同的数据形成一个新的快照分支。
mysql 从账户中选择*;
+–+——–+
| 账户ID 余额|
+–+——–+
| 4 | 500.00 |
| 10 | 2000.00 |
+–+——–+
2 行组(0.00 秒)
mysql
— 因为拍了快照,所以事务的时间在该点被冻结,其他会话的更改不会影响冻结的数据。
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34。
这再次证实,只要在事务开始后以某种方式观察到数据,从这一刻起就会形成一个新分支。对于薛定谔的猫来说,这真的感觉就像一个平行宇宙。
#上述【MySQL】事务的快照生成点是否与薛定谔的猫有关?相关内容来源网络仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92659.html