美文网首页
关于 mysql 事务中的自增 id 的疑问

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

作者: 追风骚年 | 来源:发表于2020-08-19 14:34 被阅读0次
    • 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 和事务是独立的,互不影响。

    相关文章

      网友评论

          本文标题:关于 mysql 事务中的自增 id 的疑问

          本文链接:https://www.haomeiwen.com/subject/cewrjktx.html