Недавно я встретил новое ключевое слово в postgres, по-видимому, можно выполнить транзакцию в сериализуемом режиме с отложенным только чтением . В соответствии с документацией
Свойство транзакции DEFERRABLE не действует, если только транзакция не является SERIALIZABLE и ТОЛЬКО ДЛЯ ЧТЕНИЯ. Когда для транзакции выбраны все три свойства, транзакция может заблокироваться при первом получении ее моментального снимка, после чего она сможет работать без обычных накладных расходов, связанных с транзакцией SERIALIZABLE, и без какого-либо риска внесения вклада в сериализацию или ее отмены. неудача. Этот режим хорошо подходит для длительных отчетов или резервного копирования.
Итак, допустим, у меня есть две сериализуемые транзакции, и одна из них помечена как отложенная только для чтения. У меня есть таблица account(id,balance)
и одна строка с идентификатором 1 . Первая транзакция выполняет обновление в этой строке, а затем вторая пытается прочитать эту строку и блокируется, пока первая транзакция не зафиксирует результат. Я не понимаю сути, потому что даже если первая транзакция зафиксирует результат, вторая не увидит никаких изменений.
Если мы выполним две транзакции в сериализуемом режиме (без слова подтверждения чтения), то вторая транзакция не будет ждать подтверждения первой транзакции. В документации говорится:
транзакция может заблокироваться при первом получении снимка, после чего она может работать без обычных накладных расходов SERIALIZABLE
, разве это не блокировка? для второй транзакции хуже, чем накладные расходы сериализуемого. И документация предлагает использовать его, когда
Этот режим хорошо подходит для длительных отчетов или резервных копий
Итак, допустим, у меня есть 100 параллельных транзакций, каждая из них делает update, а затем у меня есть транзакция только для чтения, которая пытается создать отчет, она будет ждать всех этих транзакций. Я не измерял, но полагаю, что это будет дольше, чем обычная сериализуемая транзакция, которая будет делать отчеты. Я что-то пропускаю, потому что, насколько я понимаю, READ ONLY DEFFERABLE
не имеет смысла использовать