MySQL 在事务中插入数据并回滚,会不会影响到其它程序获取到插入数据的自增 ID 呢?

在百度上搜索无果后,决定还是自己去验证一下。

验证思路

  • 新建一张表。
  • 新开 2 个 Shell 窗口 A 和 B,并连接到 MySQL。
  • A 开启事务,并插入一条新数据。
  • B 开启事务,并插入一条新数据。
  • A 回滚。
  • B 提交。
  • 查看表中是否有数据,数据表现是什么。

新建一张表

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在窗口A启事务和插入数据

BEGIN;
INSERT INTO `user` (`name`) VALUES ('laijinman');

在窗口B启事务和插入数据

BEGIN;
INSERT INTO `user` (`name`) VALUES ('laijinman');

插入结果马上返回了,说明插入过程中是没锁冲突的。

在窗口A回滚事务

ROLLBACK;

在窗口B提交事务

COMMIT;

查看数据结果

SELECT * FROM `user`;

结果如下:

+----+-----------+
| id | name      |
+----+-----------+
|  2 | laijinman |
+----+-----------+
1 rows in set (0.00 sec)

分析&总结

通过验证,可以得出:

  • MySQL 在插入数据不会产生锁,无论是否在事务中。
  • 事务回滚并不影响其它数据的插入。
  • 由于事务存在回滚的可能,会导致自增 ID 不连续的情况。