关于 mysql 事务中的自增 id 的疑问

  • mysql 的自增 id 在事务回滚后会怎么样?
  • mysql 的自增 id 是什么时候生成 id 的?

开始一个试验:

创建了一个表,并查看表结构

id 自增,name 为字符串类型

1
2
3
4
5
6
7
8
$mysql>  describe a;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

开启一个事务 a,并插入 name=aa

1
2
$mysql> begin;
$mysql> insert into a(`name`) values('aa');

查看 table 中的数据

1
2
$mysql> select * from a;
Empty set (0.00 sec)

table 依然为空,开启事务后在没有 commit 的情况下,是没有修改 table 的。

开启一另个事务 b,并插入 name=bb

1
2
3
4
5
6
7
8
$mysql> begin;
Query OK, 0 rows affected (0.00 sec)

$mysql> insert into a(`name`) values('bb');
Query OK, 1 row affected (0.00 sec)

$mysql> commit;
Query OK, 0 rows affected (0.00 sec)

这里将事务 b 直接提交

查看 table 中的数据

1
2
3
4
5
6
7
$mysql> select * from a;
+----+------+
| id | name |
+----+------+
| 2 | bb |
+----+------+
1 row in set (0.00 sec)

由于事务 b 提交了,插入了一行数据,id 为 2,所以这里生成 id 是在插入的时候。

重新回到事务 a

1
2
3
$mysql> begin;
$mysql> insert into a(`name`) values('aa');
$mysql> commit;

这个时候开始提交事务 a

查看 table 中的数据

1
2
3
4
5
6
7
8
$mysql> select * from a;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
+----+------+
2 rows in set (0.00 sec)

事务 a 和 b 都提交成功,上一个事务 a 的插入的数据项也出现了。

这里再做一轮实验

开启一个事务 c,并插入 name=cc

1
2
3
$mysql> begin;
$mysql> insert into a(`name`) values('cc');
Query OK, 1 row affected (0.00 sec)

开启另一个事务 d,并插入 name=dd

1
2
3
4
5
6
$mysql> begin;

$mysql> insert into a(`name`) values('dd');
Query OK, 1 row affected (0.00 sec)

$mysql> commit;

查看 table

1
2
3
4
5
6
7
8
9
$mysql> select * from a;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 4 | dd |
+----+------+
3 rows in set (0.00 sec)

回到事务 c,并进行回滚

1
2
3
4
5
6
$mysql> begin;
$mysql> insert into a(`name`) values('cc');
Query OK, 1 row affected (0.00 sec)

$mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

查看 table

1
2
3
4
5
6
7
8
9
$mysql> select * from a;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 4 | dd |
+----+------+
3 rows in set (0.00 sec)

由于事务 c 回滚,事务 d 提交成功,所以 table 中确实是少了一行数据。

小结

mysql 的自增 id 是什么时候生成 id 的?

自增 id,是在插入的时候就已经生成了,事务并不影响 id 的自增。

mysql 的自增 id 在事务回滚后会怎么样?

如果事务回滚,table 对应的数据行就会缺失,id 也会缺失,自增 id 和事务是独立的,互不影响。

坚持原创技术分享,您的支持将鼓励我继续创作!