Могут ли два оператора «SELECT FOR UPDATE» в одной таблице вызвать взаимоблокировку?

Предположим, что две одновременные транзакции выполняют следующие запросы к базе данных Postgresql:

Transaction A:

SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE

Transaction B:

SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE

Возможно ли возникновение тупика из-за получения блокировками строк Postgresql в несогласованном порядке? Например. если Postgresql получит блокировки строк в порядке, указанном в этом примере, то существует вероятность тупиковой ситуации.

Или Postgresql достаточно интеллектуален для того, чтобы всегда получать блокировки строк таким образом, чтобы одновременное, дискретноеSELECT FOR UPDATE операторы в одной и той же таблице не могут взаимоблокировать друг друга (например, всегда получая блокировки строк в порядке первичного ключа)?

Если Postgresqldoesn't автоматически предотвращать возникновение таких взаимоблокировок, есть ли способ изменить запросы для предотвращения такой ситуации (например, если на самом деле Postgresql получает блокировки строк в порядке, в котором указаны идентификаторы, то последовательная сортировка идентификаторов должна предотвращать взаимоблокировку)?

Спасибо за любую помощь!

Ответы на вопрос(2)

Ваш ответ на вопрос