многопоточное OptimisticLockException - PullRequest
1 голос
/ 21 февраля 2020

У меня есть несколько потоков, которые читают в одной таблице. Каждый поток хочет прочитать значение из таблицы, а затем изменить состояние с used = ‘N’ на used = ‘Y’;

Value = `Select min(myColumn) where used =’N’`

Я ставлю свой метод как синхронизированный, но бывает, что несколько потоков читают одно и то же значение и когда вторая попытка обновления использовалась до 'Y', он имел *OptimisticLockException*. И у меня проблемы с производительностью, когда много потоков из-за *OptimisticLockException*. Решение SKIP_LOCK не применимо к моему делу.

У вас есть идеи, пожалуйста, как я могу решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2020

У меня нет опыта работы с Spring Boot, но при использовании обычного JPA, когда вы делаете запрос, вы можете установить LockMode.

Примерно так:

query.setLockMode(LockModeType.PESSIMISTIC_WRITE);

Таким образом, сгенерированный SQL использует функции базы данных (обычно это означает, что он добавляет «для обновления» к запросу SQL), чтобы заблокировать выбранные данные, чтобы предотвратить других клиентов от чтения до завершения транзакции.

Если вы используете этот тип блокировки, нет необходимости использовать какую-либо синхронизацию на уровне метода, потому что параллелизм будет контролироваться на уровне базы данных.

Эта статья более подробно объясняет использование пессимистического c блокировки в JPA: https://www.baeldung.com/jpa-pessimistic-locking

...