在使用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,这样就不会造成上述的问题了