2010-09-30 1 views
8

Я читал 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, да? В обоих случаях?

+0

Hi Laird. У вас была возможность поработать над этим? Любое интересное открытие? –

+0

У меня не было времени, чтобы вскочить и посмотреть, что происходит на самом деле. Я включил блокировку PESSIMISTIC_WRITE, потому что статья параллелизма, казалось, пыталась намекнуть, что это фактически позволит мне сделать UPSERT без учета гонки. Tangent: UPSERT кажется такой невероятно распространенной операцией, что ДОЛЖЕН быть способ сделать это в JPA. –

+1

У меня такое ощущение, что я что-то пропустил. Почему вы не можете просто найти find() + insert(), если это необходимо. Я полагаю, сделка будет гарантировать атомарность? Я думаю, что тип блокировки менее важен, вы даже можете использовать оптимистичную блокировку + версию? Я полагаю, что дубликаты записей защищены уникальным ограничением. –

ответ

4

Я ищу, чтобы выполнить операцию по атомному обновлению-if-found-else-insert с помощью базы данных (UPSERT).

Я, возможно, не отвечает именно весь вопрос, но если вы хотите реализовать выше без каких-либо условий гонки, вам нужно ИМО в уровне таблицы ЗАМОК в монопольном режиме (не только строк). Я не знаю, можно ли это сделать с JPA. Может быть, вы могли бы уточнить, что было бы приемлемо для вас.

2

я столкнулся такой ситуации и нашел это:

Пессимистический замок, что означает блокировку объектов на операции начинаются и сохранение блокировки во время операции выполняется этими 2 PessimisticLockModes: - LockModeType.PESSIMISTIC_READ -> объект может быть прочитан другими транзакциями, но никаких изменений не может быть - LockModeType.PESSIMISTIC_WRITE -> лица не могут быть считаны или записаны другими транзакциями

link к статье

0

Ищу сделать атомную операцию обновление, если обретенной-то еще-вставки базы данных под контролем (UPSERT).

INSERT .. ON DUPLICATE KEY UPDATE делает это.

 Смежные вопросы

  • Нет связанных вопросов^_^