В чем смысл сериализуемой отложенной транзакции только для чтения - PullRequest
0 голосов
/ 08 мая 2020

Недавно я встретил новое ключевое слово в postgres, по-видимому, можно выполнить транзакцию в сериализуемом режиме с отложенным только чтением . В соответствии с документацией

Свойство транзакции DEFERRABLE не действует, если только транзакция не является SERIALIZABLE и ТОЛЬКО ДЛЯ ЧТЕНИЯ. Когда для транзакции выбраны все три свойства, транзакция может заблокироваться при первом получении ее моментального снимка, после чего она сможет работать без обычных накладных расходов, связанных с транзакцией SERIALIZABLE, и без какого-либо риска внесения вклада в сериализацию или ее отмены. неудача. Этот режим хорошо подходит для длительных отчетов или резервного копирования.

Итак, допустим, у меня есть две сериализуемые транзакции, и одна из них помечена как отложенная только для чтения. У меня есть таблица account(id,balance) и одна строка с идентификатором 1 . Первая транзакция выполняет обновление в этой строке, а затем вторая пытается прочитать эту строку и блокируется, пока первая транзакция не зафиксирует результат. Я не понимаю сути, потому что даже если первая транзакция зафиксирует результат, вторая не увидит никаких изменений.

Если мы выполним две транзакции в сериализуемом режиме (без слова подтверждения чтения), то вторая транзакция не будет ждать подтверждения первой транзакции. В документации говорится:

транзакция может заблокироваться при первом получении снимка, после чего она может работать без обычных накладных расходов SERIALIZABLE

, разве это не блокировка? для второй транзакции хуже, чем накладные расходы сериализуемого. И документация предлагает использовать его, когда

Этот режим хорошо подходит для длительных отчетов или резервных копий

Итак, допустим, у меня есть 100 параллельных транзакций, каждая из них делает update, а затем у меня есть транзакция только для чтения, которая пытается создать отчет, она будет ждать всех этих транзакций. Я не измерял, но полагаю, что это будет дольше, чем обычная сериализуемая транзакция, которая будет делать отчеты. Я что-то пропускаю, потому что, насколько я понимаю, READ ONLY DEFFERABLE не имеет смысла использовать

...