MySQL高级-MVCC-基本概念(当前读、快照读)

发布于:2024-07-06 ⋅ 阅读:(12) ⋅ 点赞:(0)

1、MVCC基本概念

全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段undo log日志readView

1.1、当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select…lock in share mode(共享锁),select…for update、update、insert、delete(排他锁)都是一种当前读。

1.1.1、创建表 stu

mysql> DROP TABLE IF EXISTS `stu`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE `stu`  (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `age` int NOT NULL,
    ->   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, 
    ->   PRIMARY KEY (`id`) USING BTREE,
    ->   INDEX `idx_t_age`(`age`) USING BTREE
    -> ) ENGINE = InnoDB CHARACTER SET = utf8mb4;
Query OK, 0 rows affected (0.37 sec)

mysql> INSERT INTO `stu` VALUES (1, 1, 'tom');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `stu` VALUES (3, 3, 'cat');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `stu` VALUES (8, 8, 'rose');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `stu` VALUES (11, 11, 'jetty');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `stu` VALUES (19, 19, 'lily');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `stu` VALUES (25, 25, 'luci');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> 

1.1.2、测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

select * from stu lock in share mode;
  • 在测试中我们可以看到,即使是在默认的RR隔离级别下,事务A中依然可以读取到事务B最新提交的内容,
  • 因为在查询语句后面加上了 lock in share mode 共享锁,此时是当前读操作。
  • 当然,当我们加排他锁的时候,也是当前读操作。

1.2、快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读

  • Read Committed:每次select,生成一个快照读
  • Repeatable Read:开启事务后第一个select语句才是快照读的地方
  • Serializable:快照读会退化为当前读

网站公告

今日签到

点亮在社区的每一天
去签到