Mybatis获取自增主键并发问题,Jdbc3KeyGenerator
已知:
在数据库表自增的情况下,mybatis执行完一条insert sql后,Jdbc3KeyGenerator获取主键的逻辑,是在insert语句后获取最大的id。
场景:
线程A:插入insert语句先执行,然后执行Jdbc3KeyGenerator获取最大的id。
那么在线程A的Jdbc3KeyGenerator获取最大id前一时刻,线程B:又有insert语句执行了。
问:
那线程A获取到的id是线程B执行insert后的id,还是线程A执行insert的id。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不说数据库的情况下,就默认你是mysql吧,对于获取自增id的场景,mysql是插入完以后执行select LAST_INSERT_ID()就能获取到最大id(oracle在插入前,这点不同),mybatis做的也就是这样了,至于获取具体的数值,那是数据库对于这个的处理,特意试了下,开启事务以后,A事务先插入,但是不查询LAST_INSERT_ID(),B事务一次操作完,在B事务不管是否提交,A执行select LAST_INSERT_ID都是获取自己插入后的id,并没有串到B的id
LAST_INSERT_ID()
是按连接维护的,不同的请求相互之间不会受影响,线程A拿到的就是线程A的INSERT ID
。如果使用SELECT MAX(ID)
肯定是有问题的Snowflake
生成主键ID插入,提前获知ID