Чтение начинается до завершения вставки - PullRequest
0 голосов
/ 30 мая 2020
@Transactional
    public void save(String myIds) 
    {
            synchronized (this) 
            {
                List<mydata> data = getDataToSaveOrUpdate(myIds);//Returns the new dataList and updates old data
                repository.saveAll(data);
                logger.info("request processed");
            }
        logger.debug("exiting the method");
    }

В этом методе, если я отправил два одинаковых запроса с разницей между 0,5 se c, что произойдет, метод getDataToSaveOrUpdate начнет чтение данных из репозитория до того, как предыдущий запрос saveAll завершит задание.

Примечание. Одна вещь, которую я заметил, будет работать правильно после удаления @ Transactional

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Обработка второго запроса начинается, как только первый поток выходит из синхронизированного блока. К тому времени транзакция может еще не быть совершена. Транзакция будет зафиксирована только после завершения выполнения метода.

Одно из возможных решений - добавить ключевое слово synchronized в сам метод.

@Transactional
public synchronized void save(String myIds) {    
    List<mydata> data = getDataToSaveOrUpdate(myIds);//Returns the new dataList and updates old data
    repository.saveAll(data);
    logger.info("request processed");
    logger.debug("exiting the method");
}

При использовании * нужно быть очень осторожным. 1007 * ключевое слово. Я не знаю, что вам нужно, возможно, это допустимое использование для вашего сценария.

0 голосов
/ 30 мая 2020

Возможно, вам нужно LockModeType (PESSIMISTIC_WRITE) .

...