InnoDB事务隔离级别测试
命令
查看事务隔离级别
show variables like '%tx_isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
设置事务隔离级别
## 设置读未提交
set global transaction isolation level read uncommitted;
## 设置读已提交
set global transaction isolation level read committed;
## 设置可重复读
set global transaction isolation level repeatable read;
## 设置序列化
set global transaction isolation level serializable;
数据准备
创建表
CREATE TABLE `user_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
`user_name` varchar(32) NOT NULL COMMENT '用户姓名',
`age` int(3) NOT NULL COMMENT '用户年龄',
`sex` char(1) NOT NULL COMMENT '用户性别',
`address` varchar(128) NOT NULL COMMENT '用户住址',
`phone` varchar(15) NOT NULL COMMENT '联系电话',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用户信息表'
初始化数据
INSERT INTO user_info (id, user_id, user_name, age, sex, address, phone, create_time, update_time) VALUES (1, 1, 'user001', 20, '1', '北京市海淀区中关村', '13800001122', '2022-06-06 23:06:01', '2022-06-06 23:06:01');
+----+---------+-----------+-----+-----+-----------------------------+-------------+---------------------+---------------------+
| id | user_id | user_name | age | sex | address | phone | create_time | update_time |
+----+---------+-----------+-----+-----+-----------------------------+-------------+---------------------+---------------------+
| 1 | 1 | user001 | 20 | 1 | 北京市海淀区中关村 | 13800001122 | 2022-06-06 23:06:01 | 2022-06-06 23:06:01 |
+----+---------+-----------+-----+-----+-----------------------------+-------------+---------------------+---------------------+
1 row in set (0.00 sec)
验证
隔离级别 | 会话A操作 | 会话B操作 |
---|---|---|
READ-UNCOMMITTED | 新插入记录 | 可以读到未提交时新插入的记录 |
- | 修改记录 | 可以读到未提交时的修改记录 |
- | 删除记录 | 可以感知未提交时的删除记录操作 |
READ-COMMITTED | 新插入记录 | 可以读到提交后新插入的记录 |
- | 修改记录 | 可以读到提交后的修改记录 |
- | 删除记录 | 可以感知提交后删除记录操作 |
REPEATABLE-READ | 新插入记录 | 读不到新插入的记录,新记录不可见 |
- | 修改记录 | 读取不到修改后的记录,一直读取原值 |
- | 删除记录 | 感知不到删除记录操作,一直读取原值 |
SERIALIZABLE | 新插入记录会阻塞,直到另一个会话事务结束 | 读取会阻塞直到另一个会话事务结束,只能读到提交后的记录 |
- | 修改记录会阻塞,直到另一个会话事务结束 | 读取会阻塞直到另一个会话事务结束,只能读到提交后的记录 |
- | 删除记录会阻塞,直到另一个会话事务结束 | 读取会阻塞直到另一个会话事务结束,只能读到提交后的记录 |