mysql:简单理解mysql mvcc的可重复读

# 原理

假设有这样的sql

begin
select(或updateinsertdelete...
commit
  • 当执行【begin】的时候,标记有一个新事务要开始,但是事务还没有真正开始,事务id还没有产生
  • 当执行事务里面的第一个sql语句时(这里是select),该事务才真正开始,这时事务id才产生。
  • 后面所有的【快照读】查询都会基于这个事务id进行数据的查询,【其它事务id】大于【本事务id】的数据不会被查出来

# 实验与证明

假设有这样的sql语句

select now(); 

begin;

select id, name from chz_user where id = 1;
select * from information_schema.INNODB_TRX;

commit;

先执行:

select now();
begin;

执行这两句的目的是先查看当前时间,可以看到当前时间【09:55:57】,然后标记开始一个新的事务。
注意【begin】差不多也是这个时间被执行的。
在这里插入图片描述
等十几秒左右,接着执行:

select id, name from chz_user where id = 1;
select * from information_schema.INNODB_TRX;

之所以在前面放一句【select】是因为不执行任何语句的话新的事务是不会开始的,这里执行【select】之后事务才真正开始,事务id才真正产生。
然后下一句查询【information_schema.INNODB_TRX】就是为了查询【当前事务id】和【事务开始时间】,结果如下:
在这里插入图片描述
可以看出事务的开始时间是比执行【begin】的时候晚了【19秒】的

# 参考资料

https://pdai.tech/md/db/sql-mysql/sql-mysql-mvcc.html

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 06:46:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 06:46:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 06:46:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 06:46:04       20 阅读

热门阅读

  1. Qt 槽函数重载时通过函数指针绑定

    2024-06-16 06:46:04       9 阅读
  2. 常用的Linux、python命令

    2024-06-16 06:46:04       6 阅读
  3. 【学习笔记】MySQL(Ⅲ)

    2024-06-16 06:46:04       8 阅读
  4. 【手机】米10替换基带

    2024-06-16 06:46:04       7 阅读
  5. Cheat Engine.exe修改植物大战僵尸阳光与冷却

    2024-06-16 06:46:04       9 阅读
  6. 模拟题1(考虑周全以及情况较多)

    2024-06-16 06:46:04       6 阅读
  7. 深入理解Python闭包:概念、应用与示例

    2024-06-16 06:46:04       10 阅读
  8. 目录深度探索

    2024-06-16 06:46:04       7 阅读
  9. Leetcode.2601 质数减法运算

    2024-06-16 06:46:04       8 阅读
  10. Web前端图形显示:深入探索与实用指南

    2024-06-16 06:46:04       9 阅读
  11. seata源码分析(04)_TM开启全局事务

    2024-06-16 06:46:04       5 阅读
  12. 738. 单调递增的数字

    2024-06-16 06:46:04       9 阅读