【MySQL】事务的快照生成时间点和薛定谔的猫相关?(mysql快照原理)

【MySQL】事务的快照生成时间点和薛定谔的猫相关?概述 最近因为工作需要,对MySQL的事务处理进行了一系列测试验证,其中,对于MySQL的事务到底时什么时候生成了数据的快照,结果似

概述

最近,因为工作的原因,我一直在对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

(0)
CSDN's avatarCSDN
上一篇 2024年6月28日 上午1:40
下一篇 2024年6月28日 上午2:34

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注