MySql插入一条数据不提交事务主键还是会自增1

在使用mybatis想要插入一条数据时,需要最后将事务提交,这时如果设置了主键自动递增,主键会随着数据的插入自增1。但是看下面的情况。

try (SqlSession sqlSession = sessionFactory.openSession()) {
    
    
	MyUser myUser = new MyUser();
    myUser.setUname("MMC");
    myUser.setUsex("MAN");
    mapper.addUser(myUser);//事务不提交,但是主键还是会自动增长
    //sqlSession.commit();
   }

第一次事务注释运行程序会发现数据库没有新增数据
第二次取消注释运行程序发现数据是插入成功了,但是主键却增了2次在这里插入图片描述
原因是:mysql数据库主键不是事务性质的,所以当没有提交事务时,主键的自动递增是不会回滚的,之所以不把主键自增加入到事务管理,可以看一下例子

//transaction1
begain transaction
insert into A
commit
//transaction2
begain transaction
insert into A
commit

当两次给A表插入数据时间间隔1毫秒,事务1插入进去id自增1了,还没等事务1完成,事务2也开始插入数据,这时他们拿到的id都还是没有自增的、同一个id,所以这会造成主键的重复,所以mysql没有将主键纳入事务管理,只要有数据插入,不管事务是否提交完成,主键先自增1,这样就不会造成上述的问题了

猜你喜欢

转载自blog.csdn.net/qq_33473340/article/details/108429630