左边启动一个事务,然后插入一个数据;右边启动一个事务,然后插入一个数据,为啥右边插入的数据的 ID 会在左边的基础上自增1呢?
表结构如下:
USE test;
SET NAMES utf8mb4;
CREATE TABLE `actor` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'name',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
);
session 1 | session 2 |
---|---|
初始状态,表为空 mysql> select * from actor; Empty set (0.00 sec) |
初始状态,表为空 mysql> select * from actor; Empty set (0.00 sec) |
开启一个事务:start transaction; |
|
开启一个事务:start transaction; |
|
插入一条数据:insert into actor (name) values ('name-a'); |
|
查看结果:select * from actor \G ,有一条数据 id: 1 name: name-a create_time: 2022-10-14 09:39:28 update_time: 2022-10-14 09:39:28 |
|
查看结果:select * from actor \G Empty set (0.00 sec) 无数据 |
|
插入一条数据:insert into actor (name) values ('name-b'); Query OK, 1 row affected (0.00 sec) |
|
查看数据:select * from actor \G; 只有一条数据: id: 2 name: name-b create_time: 2022-10-14 09:39:59 update_time: 2022-10-14 09:39:59 注:奇怪的事情出现了,为什么id 是2,当前 session 的事务是和左边 session 的事务隔离的啊。 |
|
提交事务:commit ; Query OK, 0 rows affected (0.05 sec) |
|
查询数据:mysql> select * from actor \G ,结果还是只有一条 id: 1 name: name-a create_time: 2022-10-14 10:34:43 update_time: 2022-10-14 10:34:43 |
|
提交事务:commit ; Query OK, 0 rows affected (0.08 sec) |
|
查询数据:select * from actor \G ,结果有两条 id: 1 name: name-a create_time: 2022-10-14 10:34:43 update_time: 2022-10-14 10:34:43 ------------------ 2. row ----------------- id: 2 name: name-b create_time: 2022-10-14 10:35:57 update_time: 2022-10-14 10:35:57 |
|
查询数据:select * from actor \G ,结果也是两条 id: 1 name: name-a create_time: 2022-10-14 10:34:43 update_time: 2022-10-14 10:34:43 ---------------- 2. row ------------------ id: 2 name: name-b create_time: 2022-10-14 10:35:57 update_time: 2022-10-14 10:35:57 |
- 如果使用
start transaction ;
开启一个事务,最后退出session之前没有执行commit
,那么事务中操作的数据不会保存到数据库。 - 事务是隔离的,但是自增 id 之间貌似不是隔离的。