Уровень изоляции транзакций и блокировки записей, отключение SELECT для записей, находящихся в запущенной транзакции - PullRequest
3 голосов
/ 23 октября 2019

Могу ли я отключить SELECT для строк, которые были использованы внутри транзакции?

Например, строки в таблице potato уничтожаются в транзакции 1, и для этого требуется много времени. В транзакции 2 в таблице potato указано SELECT*. Я не хочу выбирать те записи, которые используются в транзакции 1.

Итак, результат для SELECT* potato без записей, которые используются в транзакции 1.

Подходит ли сериализуемый уровень изоляции для транзакции 1, поэтому транзакция 2 не может выбрать эти строки? Или мне нужно заблокировать эти записи с помощью режима блокировки ?

Я пытаюсь избежать флагов в базе данных или Redis.

Вещи, которые я нашел:

1 Ответ

1 голос
/ 23 октября 2019

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

Все вышесказанное, если вы все еще настаиваете на своем требовании, вот как вы можете это сделать:

Транзакция удаления просто удаляет картофель с помощью DELETE, но вы используете измененный запрос для выбора картофеля:

SELECT /* whatever */
FROM potatoes
WHERE /* condition */
FOR SHARE OF potatoes SKIP LOCKED;

В отличие от обычного SELECT, этот запрос будет устанавливать блокировку SHARE в каждой выбранной строке. Такие блокировки не конфликтуют друг с другом, поэтому несколько таких запросов могут выбрать один и тот же картофель.

Однако блокировка будет конфликтовать с блокировкой строки EXCLUSIVE DELETE, поэтому он не может выбрать такойстрок. Чтобы избежать блокировки при обнаружении такой строки, вы добавляете SKIP LOCKED, как в моем примере.

Все это не бесплатно: блокировка строки изменяет строку таблицы, поэтому такие запросы будут вызывать как записи, так ичитает.

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