Комментарии 2
Интересная статья, спасибо!
А есть какие-то устоявшиеся приемы, которые позволяют вставить данные в заблокированную (например, длинным select) таблицу?
Например, можно отследить, что таблица заблочена, и вставить данные во временную таблицу рядом. Трансформация данных из источника в приемник может быть очень длительной, поэтому хотелось бы, чтобы она не зависела от блокировки таблицы.
И можно после снятия блокировки (возможно и принудительной по таймауту) быстро перекачать данные из временной таблицы в основную.
Это все замечательно, но хотелось бы, чтобы ETL далее продолжался независимо от блокировки, объединяя данные из основной таблицы и временной и отправляя их дальше.
А физически объединить данные и почистить временную таблицу можно и много позже.
Какие то готовые такие приемы существуют?
С одной стороны - да, боль, ничего нельзя поделать - ну как можно писать в таблицу из которой идёт чтение? можно орг. путями разводить формирование и потребление по времени, в т. ч. отправкой уведомлений "вот теперь-то можно! (читать из таблицы)" и килянием тех кто читает во время ETL; можно формировать в подменную таблицу, это уменьшит вероятность пересечения - из готовой таблицы перенос данных в основную займет меньше времени. И вообще - длинные запросы хорошо бы делать порциями, в этом юзерам можно помочь
С другой стороны - MVCC!, насколько я понимаю; в том же Postgres он есть безальтернативно (а в MSSQL есть snapshot и даже можно переопределить read committed в shapshot). Т.е. когда есть изоляция на основе версий строк - то и блокировок в привычном виде нет. В нашей ситуации, когда запрос на чтение уже работает - он работает со своим снимком данных, ему уже ничто в этой жизни не помешает; а запрос на запись просто возьмет и вставит данные; последующие запросы на чтение уже будут видеть новые строки. Достигается это тем, что версии строк множатся под капотом, и версии строк которые уже ни кому не увидеть надо чистить командой VACUUM (говорю о Postgres). Проверил, кстати, набрал примерчик - так и работает.
SSDF — велосипед для ETL на SQL