码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-05 12:56:32      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

  环境:

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

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

     现象:

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

    分析:

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

   解决方法:

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

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

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

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!