Блокировки базы данных и уровень изоляции в JPA
Я не уверен в понимании блокировок базы данных. Я использую повторяемый уровень изоляции чтения. Согласно википедии, она сохраняет блокировки чтения и записи (полученные на выбранных данных) до конца транзакции. Давайте рассмотрим следующий сценарий: "Давайте создадим два потока A, B. Поток A начинает транзакцию. Предположим, поток A получает список всех пользователей из таблицы User. (Я ожидаю, что: Поток A получил блокировки чтения и записи для всех пользователей??) Поток B начинает другую транзакцию, извлекает одного конкретного пользователя u из таблицы User и обновляет пользователя u, а затем фиксирует транзакцию (Поскольку A получил блокировки, должен ли поток B ждать, пока A совершит транзакцию??)"
Описывает ли поведение поведение при использовании JPA?
Блокировка получена, если поток A читает пользователей вне транзакции (скажем, если я использую расширенный контекст постоянства)??
1 ответ
Вы путаете уровень логической изоляции с его физической реализацией. Стандарт SQL определяет четыре уровня изоляции: "Сериализуемое", "Повторяемое чтение", "Чтение зафиксировано" и "Чтение незафиксировано", а также три способа нарушения сериализации: "грязное" чтение, неповторяемое чтение и фантомное чтение.
То, как конкретная СУБД достигает каждого уровня изоляции, - это деталь реализации, которая отличается в каждой СУБД. Некоторые СУБД могут использовать стратегию блокировки, которая означает, что используются блокировки чтения, что означает, что средства записи блокируются до завершения транзакции. Другие СУБД могут использовать другие стратегии, такие как управление несколькими версиями параллелизма, что означает, что читатели и писатели не блокируют друг друга. Чтобы максимизировать производительность и масштабируемость вашего приложения, вам нужно будет написать код для конкретной реализации СУБД, которую вы используете.