Предположим, что две одновременные транзакции выполняют следующие запросы к БД Postgresql:
Транзакция A:
SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE
Транзакция Б:
SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE
Возможно ли возникновение взаимоблокировки из-за того, что Postgresql получает блокировки строк в непоследовательном порядке? Например. если Postgresql будет получать блокировки строк в том порядке, в котором идентификаторы указаны в этом примере, то существует вероятность взаимоблокировки.
Или Postgresql внутренне достаточно умен, чтобы всегда получать блокировки строк таким образом, что одновременные дискретные операторы SELECT FOR UPDATE
в одной и той же таблице не могут блокировать друг друга (например, всегда получая блокировки строк в порядке первичного ключа)?
Если Postgresql не автоматически предотвращает возникновение таких взаимоблокировок, есть ли способ изменить запросы, чтобы предотвратить такую ситуацию (например, если на самом деле Postgresql получает блокировки строк в том порядке, в котором указаны идентификаторы, тогда последовательная сортировка идентификаторов должна предотвращать взаимоблокировку)?
Спасибо за любую помощь!
IN( .. , ..)
не подразумевает упорядоченный набор. Это просто набор (набор элементов), аналогичный результатуselect ...
, который представляет собой (неупорядоченный) набор кортежей. Другими словами: порядок оценки/выполнения не определен - person wildplasser   schedule 11.10.2012SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Таким образом, второй SELECT будет отклонен. - person bortzmeyer   schedule 11.10.2012