环境:
前端采用异步提交的方式,将选择的多个附件分批发送到服务端
后端采用标准的SpringMVC架构来处理请求,采用声明式事务,控制在service层
现象:
后台保存附件信息到数据库的时候,总是报主键唯一性约束错误
分析:
前端采用的是异步提交,第一个附件正在保存的时候,第二个附件也进入了保存方法,而保存方法的逻辑是先生成主键,然后调用save方法保存数据,那么问题就来了,第一个附件进入保存方法,生成主键,在还没有执行save方法的时候,第二个附件进入了保存方法,也生成了主键,此时生成的主键将会覆盖第一个附件保存时生成的主键,然后无论是第一个附件先执行了save还是第二个附件先执行了save,都将会引发主键唯一性约束错误。
解决方法:
1、修改生成主键的方式,让主键生成也和当前事务产生关系,比如主键是从某张表中获取的,这样数据库会帮你加锁;
2、将整个保存附件信息到数据库的方法加上synchronized关键字,以保证线程安全。
时间: 2024-11-08 15:01:34