我写了一个注册用户的接口和处理用户名相同的异常,当抛出这个异常的时候做事务回滚,现在我使用postman对我这个接口测试的时候,正常注册并插入数据库没有问题,但是当用户名相同的时候,id(自增主键)并没有像我学习的回滚那样1->3,而是1->2,我打开日志也显示是已经回滚,我现在不知道为什么会出现这样的情况
我认为当事务回滚的时候,自增主键id是不连续的状态而不是连续的
我写了一个注册用户的接口和处理用户名相同的异常,当抛出这个异常的时候做事务回滚,现在我使用postman对我这个接口测试的时候,正常注册并插入数据库没有问题,但是当用户名相同的时候,id(自增主键)并没有像我学习的回滚那样1->3,而是1->2,我打开日志也显示是已经回滚,我现在不知道为什么会出现这样的情况
我认为当事务回滚的时候,自增主键id是不连续的状态而不是连续的
自增主键(AUTO_INCREMENT)的递增机制与事务回滚的关系需要从数据库底层机制来理解:
事务回滚的作用范围
事务回滚可以保证:
✓ 已插入的数据行会被删除
✓ 表锁/行锁会被释放
✓ 但不会回滚以下内容:
**验证实验(以MySQL为例):
START TRANSACTION;
INSERT INTO users (username) VALUES ('test'); -- 分配id=2
ROLLBACK;
INSERT INTO users (username) VALUES ('test'); -- 实际得到id=3
这是数据库的标准设计行为,目的是保证主键分配的原子性和高性能。自增主键的连续性不是事务的保证范围,而是需要根据具体业务需求选择合适的主键生成策略。
3 回答3.6k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
2 回答1.8k 阅读
1 回答778 阅读✓ 已解决
1 回答1.6k 阅读
2k 阅读