【发布时间】:2021-05-25 20:25:19
【问题描述】:
我有一个集群,其中一个节点是主节点。谁将成为新主人的同步/决策是通过数据库完成的(通过java/spring/jpa访问的Postgres)。
这是我目前拥有的
@Repository
public interface ServiceRepository{
@Transactional
@Modifying
@Query("UPDATE ServiceInstance e SET e.master=true"
+ " where e.id=:serviceId AND NOT"
+ " EXISTS (SELECT master from ServiceInstance where master = true)")
int tryToBecomeMaster(@Param("serviceId") String serviceId);
集群中每个节点的数据库中都有一行ServiceInstance。每个节点都在尝试更新自己的行,但前提是没有已标记为“主”的行。该查询由每个节点定期运行。
该查询是 atomic 还是存在竞争条件?如果不是原子的,我需要什么事务隔离级别?
我主要担心的是,如果允许并行执行 2 个查询,它们可能都会将 SELECT 子句计算为 false(无主控)并更新它们的行。
【问题讨论】:
-
Postgresql 事务始终符合 ACID。 A 表示原子。是的,是的。
标签: java spring postgresql jpa transaction-isolation