基于spring事务的接口极短时间被调用2次时有冲突

迷雾骑士 2016-12-02 10:56:30
基于spring事务的接口call()极短时间被调用2次,该接口的逻辑为:先查数据库,判断是否存在记录A,若存在则对A进行更新;否则插入记录A。
前提:数据库中不存在数据A,此时开始对接口极短时间(可认为是同一时间)连续调用2次。
假设第一次调用还未结束,其事务还未被提交,因为数据库中A不存在,故在第一次调用结束后,应该是往数据库中写入数据A;
接着第二次调用开始,因为第一次调用的事务未被提交,故数据A还没有被写入数据库,第二次调用时,查询数据库,发现不存在A数据,故接口的逻辑会再次写入A数据。结果:数据A被连续写入数据库2次。
请问:该问题如何避免?期待的结果应该是:不管在如何短的时间内,该接口被调用多少次,A数据只应该在数据库中出现一次。
...全文
640 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷雾骑士 2017-01-07
  • 打赏
  • 举报
回复
引用 4 楼 wangjian223344 的回复:
是怎么@到我的 让我回贴子?
谢谢了,系统推荐的
NewshiJ 2016-12-02
  • 打赏
  • 举报
回复
虽然我不知道spring是怎么实现对数据库的事务管理 但是我个人认为应该是把两个操作封装在同一个事务里面的 当 @Transactional 注解当设置成只读时可能会出现你说那种情况,就是当前事务只有读操作 ,spring可能会开启读锁让其他事务一起操作 如果 @Transactional 注解 不设置成只读应该不会让两个事务同时操作吧,就是在我读的时候你不能读,单位读完写完的时候,你再去读数据库,毕竟人家开发也会考虑的 以上是我本人的观点,但是我也不是很了解spring的内部运行机制,在这里帮楼主顶一下,顺便等其他大牛来介绍一下spring的事务管理机制
X元素 2016-12-02
  • 打赏
  • 举报
回复
服务是单机节点的话,加锁就可以了,但一定注意锁范围。
  • 打赏
  • 举报
回复
数据库做好唯一约束+乐观锁
brooklyng60 2016-12-02
  • 打赏
  • 举报
回复
jdbc将两个数据操作放到一个事务中一起处理,没有处理前部commit,然后再此业务方法上增加synchronized关键字
魔都 2016-12-02
  • 打赏
  • 举报
回复
是怎么@到我的 让我回贴子?
魔都 2016-12-02
  • 打赏
  • 举报
回复
(1)如果这个数据有字段是唯一性,数据库上有唯一索引,那么起码在数据库层面上是不可能产生这样的数据的。 (2)spring 中一个service 就是一个事务。你在插入的时候用主键,或唯一的比如userName 查询一上数据库是否存在了。这记录,这样一样不会有问题了。 (3)1,2 都不行,spring 有自己的事务级别。但是对于不同数据库他的默认不一样。mysql oracle 就不一样。配置一下提高事务级别。 但是这种提高事务级别的事,会让访问数据库的性能大大降低。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧