Я читал this article on JPA concurrency, но либо я слишком толстый, либо недостаточно явный.Достаточно ли LockModeType.PESSIMISTIC_WRITE для UPSERT в JPA?
Я ищу для выполнения операции с атомизированным обновлением-if-found-else-insert с базой данных (UPSERT
).
Это выглядит моего бедного медленным мозг, что я могу - в рамках транзакции, конечно, - запустить именованный запрос с режимом блокировки от PESSIMISTIC_WRITE
, увидеть, если она возвращает никаких результатов, а затем либо persist()
или update()
впоследствии.
То, что я не понимаю, заключается в различиях между выполнением этой операции с блокировкой PESSIMISTIC_WRITE
против блокировки PESSIMISTIC_READ
. Я читал предложения - я понимаю, что PESSIMISTIC_READ
предназначен для предотвращения не повторяющихся чтений, а PESSIMISTIC_WRITE
... ну, может быть, я не очень хорошо понимаю это :-) - но под ним просто SQL SELECT FOR UPDATE
, да? В обоих случаях?
Hi Laird. У вас была возможность поработать над этим? Любое интересное открытие? –
У меня не было времени, чтобы вскочить и посмотреть, что происходит на самом деле. Я включил блокировку PESSIMISTIC_WRITE, потому что статья параллелизма, казалось, пыталась намекнуть, что это фактически позволит мне сделать UPSERT без учета гонки. Tangent: UPSERT кажется такой невероятно распространенной операцией, что ДОЛЖЕН быть способ сделать это в JPA. –
У меня такое ощущение, что я что-то пропустил. Почему вы не можете просто найти find() + insert(), если это необходимо. Я полагаю, сделка будет гарантировать атомарность? Я думаю, что тип блокировки менее важен, вы даже можете использовать оптимистичную блокировку + версию? Я полагаю, что дубликаты записей защищены уникальным ограничением. –