Получает ли Hibernate неявную блокировку для запроса на обновление - PullRequest
0 голосов
/ 25 декабря 2018

Я использую hibernate с весенней загрузкой, mariadb.Я выполняю обновление с именем query, внутри метода транзакционного репозитория.Запрос выглядит примерно так:

update personDetails set status='married' where personeName='abc' and personStatus='unmarried'

После этого я иду, чтобы обновить другую таблицу.

Этот поток может быть выполнен двумя отдельными потоками.Я хочу, чтобы только один поток продолжил работу, и остановил другой поток.Таким образом, поток, который может обновлять статус человека, должен продолжить работу, а другой поток должен быть остановлен.Поэтому я хочу добиться некоторой блокировки этого запроса на обновление.Таким образом, вопрос в том, нужно ли мне делать какие-либо блокировки в строке перед обновлением, или hibernate / db позаботится об этом.

1 Ответ

0 голосов
/ 25 декабря 2018

Цитировать документацию MariaDB :

Для операторов UPDATE и DELETE блокировка зависит от того, использует ли инструкция уникальный индекс с уникальным условием поиска (например, идентификатор WHERE= 100) или условие поиска типа диапазона (например, WHERE id> 100).Для уникального индекса с уникальным условием поиска InnoDB блокирует только найденную запись индекса , а не промежуток перед ним.Для поиска по типу диапазона InnoDB блокирует сканированный диапазон индекса, используя блокировки пробела или блокировки следующего ключа (разрыв плюс запись индекса), чтобы блокировать вставки другими сеансами в промежутки, охватываемые диапазоном.

Таким образом, поведение по умолчанию для MariaDB (и MySQL) во время обновления заключается в том, что, по крайней мере, конкретная запись будет заблокирована другим процессом, пытающимся ее обновить.В InnoDB, если подходящий индекс недоступен, возможно, будет заблокирована не только запись.На других движках, например, MyISAM, в документации также сказано, что вся таблица может быть заблокирована.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...