我有一个Spring Boot Web服务,该服务具有某种方法,该方法执行从数据库获取数据,然后插入不存在的消息(之间存在一些逻辑,我现在宁愿保留在Java中)。 该方法使用@Transactional进行注释,但是当然使用默认的隔离级别(已提交读),如果两个并行运行,最终可能会在同一行中插入两次。 如果将隔离级别更改为可序列化,则性能会受到影响。 使用纯Java同步并在唯一表示要查询/添加的项目的全局对象上进行同步会更好吗?基本上,我会实习传递给该方法的字符串param,该方法表示某些项目名称,并与之进行同步。 显然,我无法水平扩展,但让我们假设该Web服务实例是数据库的唯一客户端。
答案 0 :(得分:3)
为插入的数据添加唯一约束。这样,您将无法两次插入相同的数据。
答案 1 :(得分:0)
如果您可以确定Web Service是唯一的客户端,并且仅运行一个实例(而不是Synchronized)可以完美地完成工作,但这不是一个好习惯,那么您最好执行严格的Db隔离,甚至在实现一致性检查和约束时数据库级别