设为首页 收藏本站
查看: 736|回复: 0

[经验分享] 关于使用mysql的 SELECT LAST_INSERT_ID() 语句碰到的问题

[复制链接]

尚未签到

发表于 2016-10-23 09:20:40 | 显示全部楼层 |阅读模式
  先说下使用mysql 的 SELECT LAST_INSERT_ID()这个sql语句的场景,就是我们向主键是自增的mysql数据表(简称user表)中insert一条记录后,我们期望 获取刚刚写入这条记录的id,因为某些场景下需要获得这个id去做其它的操作,所以很自然的想到了使用SELECT LAST_INSERT_ID() 这个sql语句来获取插入记录后返回的自增id,参考sql语句如下:
  ​<insert id="insert" parameterClass="UserDO">
INSERT INTO user( user_id,user_nick,tel_phone,address,status, user_type,remark, gmt_create, gmt_modified)
VALUES ( #userId#, #userNick#, #telPhone#, #address#, #status#,
#userType#, #remark#, now(), now())
<selectKey keyProperty="id" resultClass="java.lang.Long">
SELECT LAST_INSERT_ID() AS value
</selectKey>
</insert>
其中user表的主键是自增的id.
 
        通过这种方式获取返回的自增id的确大多数情况下的确也能测试通过,所以测试的时候自己也很难发现问题,我就简单说下我碰到的情况:
        问题1.有些时候调用Object  id=getSqlMapClientTemplate().insert("UserDO.insert", userDO);这个语句返回的id返回的值是0,但是的确记录是写入到数据库user表中去了,这种情况直接导致我用返回值id大于0来判断 insert成功这个逻辑不准备,因为有的时候写入成功了也会返回0,这个问题不是每次都能重现,所以很诡异。
       问题2.有些时候调用Object  id=getSqlMapClientTemplate().insert("UserDO.insert", userDO);这个语句返回的id返回的值是大于0,但是用这个id去查询user表这条记录时确提示失败,原来是<selectKey keyProperty="id" resultClass="java.lang.Long">
SELECT LAST_INSERT_ID() AS value
</selectKey>
这个语句的意思是返回最后一个写入数据库的id,但是在高并发多个数据表都有写入的情况,下,这个语句返回的就有可能是另外一张表刚刚写入的数据库id,这样根据这个id去查询就返回没有这个记录了
 
        对于以上这两种情况我目前我使用的办法就是insert记录后不根据返回的id值来判断,而是用这个user表的唯一索引user_id去重新查一次user表来获取这个id,这种重新去查的方法基本可以满足大部分场景需求
        写这篇文章主要有三个目的:
1.我踩到过这个坑,希望大家引以为鉴,因为测试的时候也比较难发现,希望大家不要犯类似错误
2.对于上面提到的问题1有时候会返回0的情况实在没想通,所以请各位大神帮我扫下盲
3.对于上面提到的解决办法,如果碰到没有设置唯一索引的情况,并且通过多个字段联合查询也不能唯一确定返回的记录是不是就是你刚刚写入的记录的这种情况下,是否有其它的方法可以尝试,在这方面是个新人,求各位大神多多指导!
 
摘自:http://www.atatech.org/article/detail/14015/0

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-290088-1-1.html 上篇帖子: 高性能MySql进化论(六):常见索引类型的原理及其特点的介绍 下篇帖子: [MySQL 友情协助] ERROR 3 (HY000): Error writing file '/dev/shm/MYHTwgxT' (Errcode: 2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表