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

2020-08-19  本文已影响0人  追风骚年

开始一个试验:

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

id 自增,name 为字符串类型

$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

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

查看 table 中的数据

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

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

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

$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 中的数据

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

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

重新回到事物a

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

这个时候开始提交事物a

查看 table 中的数据

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

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

这里再做一轮实验

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

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

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

$mysql> begin;

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

$mysql> commit;

查看 table

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

回到事物 c,并进行回滚

$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

$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 和事务是独立的,互不影响。

上一篇 下一篇

猜你喜欢

热点阅读