Блокировка таблицы транзакций только для чтения - PullRequest
1 голос
/ 07 ноября 2011

Я использую JPA 2.0, Hibernate и MySQL. Изоляция базы данных MySQL - это TRANSACTION_REPEATABLE_READ. У меня есть набор запросов, которые будут использоваться для отображения данных на сайте. Некоторые из этих запросов должны будут извлекать много строк, и они могут быть изменены в середине другим процессом. Должен ли я использовать какой-либо вид блокировки (пессимистический или оптимистический) для этих запросов только для чтения, чтобы убедиться, что набор результатов будет согласованным?

Имеет ли смысл использовать оптимистическую блокировку с автоматическим контролем версий объектов посредством аннотации @Version для запросов только для чтения?

Я не уверен, зачем кому-либо явно указывать LockModeType.OPTIMISTIC для объекта или запроса. Если объект версионирован, он все равно будет проверен на коммите, верно?

1 Ответ

1 голос
/ 07 ноября 2011

Если вы поместите свои выборки в транзакцию, уровень изоляции TRANSACTION_REPEATABLE_READ будет препятствовать обновлению выбранных строк, пока ваша транзакция выбора не будет зафиксирована. Но не помешают вставки.

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

Оптимистическая стратегия блокировки с контролем версий более полезна в случае использования «изменить запись», когда какой-либо клиент выбирает строку, тратит 2,3 или 10 минут на поиск / изменение записи (в пользовательском интерфейсе), а затем сохраняет (фиксирует) ) его модификации. С помощью этой стратегии мы не хотим, чтобы другие клиенты ожидали, пока первый из них сохранит свои модификации.

...