文章目录
- 1、MVCC基本概念
- 1.1、当前读
- 1.1.1、创建表 stu
- 1.1.2、测试
- 1.2、快照读
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:快照读会退化为当前读