Как обновить глобальный флаг, когда был установлен последний локальный флаг, не блокируя весь объект каждый раз? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть две таблицы

Тест:

-----------------------------------------------
|    id       |    name   | read_dt   |  ref  |
-----------------------------------------------
|    1        |  entity1  |   null    |   1   |
-----------------------------------------------
|    2        |  entity2  |   null    |   1   |
-----------------------------------------------
|    3        |  entity3  |   null    |   1   |
-----------------------------------------------

Тест2:

---------------------------
|    id       |    read   |
---------------------------
|    1        |    false  |
---------------------------

Мне нужно обновить чтение в таблице Test2, когда все read_dt в тестестол был накрыт. У меня есть метод для этого

public void updateData(int id) {
        EntityManager em = persistenceBean.getEm();

        Test2Entity result = em.createNamedQuery("Test2Entity.select", Test2Entity.class)
                .setLockMode(LockModeType.PESSIMISTIC_WRITE)
                .getResultList()
                .get(0);

        for (TestEntity entity : result.getTestsById()) {
            if (entity.getId() == id) {
                entity.setReadDt(Calendar.getInstance().getTime());
                em.merge(entity);
            }
        }

        for (TestEntity entity : result.getTestsById()) {
            if (entity.getReadDt() == null) {
                return;
            }
        }

        result.setRead(true);
        em.merge(result);
    }

Этот метод может вызываться с разными идентификаторами из разных потоков (а также может не вызываться никогда для некоторых объектов). Этот код работает нормально, но теперь я блокирую всю сущность для каждого вызова метода. На самом деле мне не нужно блокировать его каждый раз, мне нужно блокировать его только для последних потоков, которые гарантированно установили чтение. Можно ли как-то этого добиться (когда я удаляю PESSIMISTIC_WRITE, чтение остается ложным, даже если все даты были установлены)?

...