【发布时间】:2019-02-28 04:38:23
【问题描述】:
每次有新数据进来,我都会检查数据库,如果有与新数据相关的记录,我会得到它并根据新数据和旧记录更新记录;如果不存在记录,我将为新数据创建一个新记录;
问题:当有多个线程做同样的事情时,自然会形成read -> check -> update 模式,从而产生race condition。
我尝试了以下解决方案,但它们似乎都不太好。
-
为
aFieldOrSeveralFields添加唯一约束到db,尝试捕捉SQLIntegrityConstraintViolationException然后重试read -> check -> update进程;- 我可以捕捉到
Exception,但它在我看来危险; - 或者我可以通过
e instanceof SQLIntegrityConstraintViolationException进行检查,让其他异常冒出来,但它看起来丑;
- 我可以捕捉到
对整个
read -> check -> update使用synchronised但似乎相当无效,因为有明显的I/O操作。
2019 年 3 月 11 日更新
最后,为了平衡丑陋的处理和效果,我使用synchronised将任务拆分为更小的任务,以确保数据的一致性,直到现在没有明显的性能问题上升。
【问题讨论】:
标签: java postgresql hibernate spring-boot race-condition