- mysql 的自增id 在事务回滚后会怎么样?
- mysql 的自增id 是什么时候生成id的?
开始一个试验:
创建了一个表,并查看表结构
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 和事务是独立的,互不影响。
网友评论