首页 > 编程语言 > 详细

讨论一个并发线程导致的数据保存失败的问题

时间:2015-02-05 12:54:16      阅读:424      评论:0      收藏:0      [点我收藏+]

  环境:

前端采用异步提交的方式,将选择的多个附件分批发送到服务端

后端采用标准的SpringMVC架构来处理请求,采用声明式事务,控制在service层

     现象:

后台保存附件信息到数据库的时候,总是报主键唯一性约束错误

    分析:

前端采用的是异步提交,第一个附件正在保存的时候,第二个附件也进入了保存方法,而保存方法的逻辑是先生成主键,然后调用save方法保存数据,那么问题就来了,第一个附件进入保存方法,生成主键,在还没有执行save方法的时候,第二个附件进入了保存方法,也生成了主键,此时生成的主键将会覆盖第一个附件保存时生成的主键,然后无论是第一个附件先执行了save还是第二个附件先执行了save,都将会引发主键唯一性约束错误。

   解决方法:

1、修改生成主键的方式,让主键生成也和当前事务产生关系,比如主键是从某张表中获取的,这样数据库会帮你加锁;

2、将整个保存附件信息到数据库的方法加上synchronized关键字,以保证线程安全。

讨论一个并发线程导致的数据保存失败的问题

原文:http://www.cnblogs.com/anai/p/4274310.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!