48.9. ÐеÑедаÑа болÑÑÐ¸Ñ ÑÑанзакÑий Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого декодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ #
ÐазовÑе обÑабоÑÑики модÑÐ»Ñ Ð²Ñвода (напÑимеÑ, begin_cb, change_cb, commit_cb и message_cb) вÑзÑваÑÑÑÑ, ÑолÑко когда ÑÑанзакÑÐ¸Ñ Ð½Ð° Ñамом деле ÑикÑиÑÑеÑÑÑ. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² лÑбом ÑлÑÑае декодиÑÑÑÑÑÑ Ð¸Ð· жÑÑнала ÑÑанзакÑий, но пеÑедаÑÑÑÑ Ð² модÑÐ»Ñ Ð²Ñвода ÑолÑко пÑи ÑикÑаÑии (и оÑбÑаÑÑваÑÑÑÑ, еÑли ÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ).
ÐÑо ознаÑаеÑ, ÑÑо, Ñ Ð¾ÑÑ Ð´ÐµÐºÐ¾Ð´Ð¸Ñование пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑно и декодиÑÑемÑе запиÑи могÑÑ Ð²ÑÑеÑнÑÑÑÑÑ Ð½Ð° диÑк, ÑÑÐ¾Ð±Ñ ÑменÑÑиÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð½Ð° опеÑаÑивнÑÑ Ð¿Ð°Ð¼ÑÑÑ, вÑе декодиÑованнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÐµÑеданÑ, когда ÑÑанзакÑÐ¸Ñ Ð¾ÐºÐ¾Ð½ÑаÑелÑно ÑикÑиÑÑеÑÑÑ (или, ÑоÑнее, когда ÑикÑаÑÐ¸Ñ Ð´ÐµÐºÐ¾Ð´Ð¸ÑÑеÑÑÑ Ð¸Ð· жÑÑнала ÑÑанзакÑий). РзавиÑимоÑÑи Ð¾Ñ ÑазмеÑа ÑÑанзакÑии и пÑопÑÑкной ÑпоÑобноÑÑи ÑеÑи вÑÐµÐ¼Ñ Ð¿ÐµÑедаÑи Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¿ÑименениÑ.
ЧÑÐ¾Ð±Ñ ÑменÑÑиÑÑ Ð·Ð°Ð´ÐµÑжкÑ, ÑвÑзаннÑÑ Ñ Ð±Ð¾Ð»ÑÑими ÑÑанзакÑиÑми, модÑÐ»Ñ Ð²Ñвода Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй обÑабоÑÑик Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки инкÑеменÑалÑной пеÑедаÑи вÑполнÑÑÑиÑ
ÑÑ ÑÑанзакÑий. ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½ÐµÑколÑко обÑзаÑелÑнÑÑ
обÑабоÑÑиков пеÑедаÑи (stream_start_cb, stream_stop_cb, stream_abort_cb, stream_commit_cb и stream_change_cb) и два необÑзаÑелÑнÑÑ
обÑабоÑÑика (stream_message_cb) и (stream_truncate_cb). ÐÑоме Ñого, еÑли планиÑÑеÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¿Ð¾ÑоковÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð²ÑÑ
ÑазнÑÑ
команд, нÑÐ¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе обÑабоÑÑики. (Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 48.10).
Ðогда вÑполнÑÑÑаÑÑÑ ÑÑанзакÑÐ¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² поÑоке, ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (и ÑообÑениÑ) пеÑедаÑÑÑÑ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸, гÑаниÑÑ ÐºÐ¾ÑоÑÑÑ
обознаÑаÑÑ Ð²ÑÐ·Ð¾Ð²Ñ stream_start_cb и stream_stop_cb. ÐоÑле Ñого, как вÑе декодиÑованнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑеданÑ, ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÑикÑиÑована обÑабоÑÑиком stream_commit_cb (или, возможно, пÑеÑвана обÑабоÑÑиком stream_abort_cb). ÐÑли поддеÑживаÑÑÑÑ Ð´Ð²ÑÑ
ÑазнÑе ÑикÑаÑии, ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовлена обÑабоÑÑиком stream_prepare_cb, заÑикÑиÑована (COMMIT PREPARED) обÑабоÑÑиком commit_prepared_cb или пÑеÑвана обÑабоÑÑиком rollback_prepared_cb.
ÐапÑимеÑ, поÑледоваÑелÑноÑÑÑ Ð²Ñзовов обÑабоÑÑиков поÑока Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакой:
stream_start_cb(...); <-- наÑало пеÑвого блока изменений stream_change_cb(...); stream_change_cb(...); stream_message_cb(...); stream_change_cb(...); ... stream_change_cb(...); stream_stop_cb(...); <-- ÐºÐ¾Ð½ÐµÑ Ð¿ÐµÑвого блока изменений stream_start_cb(...); <-- наÑало вÑоÑого блока изменений stream_change_cb(...); stream_change_cb(...); stream_change_cb(...); ... stream_message_cb(...); stream_change_cb(...); stream_stop_cb(...); <-- ÐºÐ¾Ð½ÐµÑ Ð²ÑоÑого блока изменений [a. пÑи иÑполÑзовании ноÑмалÑной ÑикÑаÑии] stream_commit_cb(...); <-- ÑикÑаÑÐ¸Ñ Ð¿ÐµÑеданной ÑÑанзакÑии [b. пÑи иÑполÑзовании двÑÑ Ñазной ÑикÑаÑии] stream_prepare_cb(...); <-- подгоÑовка пеÑеданной ÑÑанзакÑии commit_prepared_cb(...); <-- ÑикÑаÑÐ¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленной ÑÑанзакÑии
Ðа пÑакÑике же поÑледоваÑелÑноÑÑÑ Ð²Ñзовов обÑабоÑÑика Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÐµÐµ Ñложной. Рней могÑÑ Ð±ÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ неÑколÑÐºÐ¸Ñ Ð¿ÐµÑедаваемÑÑ Ð² поÑоке ÑÑанзакÑий, какие-Ñо ÑÑанзакÑии могÑÑ Ð¿ÑеÑÑваÑÑÑÑ Ð¸ Ñ. д.
Ðодобно Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²ÑÑеÑÐ½ÐµÐ½Ð¸Ñ Ð½Ð° диÑк, пеÑедаÑа в поÑоке запÑÑкаеÑÑÑ, когда обÑее колиÑеÑÑво изменений, декодиÑованнÑÑ
из WAL (Ð´Ð»Ñ Ð²ÑеÑ
ÑекÑÑиÑ
ÑÑанзакÑий), пÑевÑÑÐ°ÐµÑ Ð¿Ñедел, заданнÑй паÑамеÑÑом logical_decoding_work_mem. Ð ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑбиÑаеÑÑÑ ÑÐ°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ (ÑÑо опÑеделÑеÑÑÑ Ð¿Ð¾ обÑÑÐ¼Ñ Ð¿Ð°Ð¼ÑÑи, коÑоÑÑй Ñже занимаÑÑ Ð´ÐµÐºÐ¾Ð´Ð¸ÑованнÑе изменениÑ) веÑÑ
него ÑÑовнÑ, и она пеÑедаÑÑÑÑ Ð² поÑоке. Тем не менее, в некоÑоÑÑÑ
ÑлÑÑаÑÑ
вÑÑ Ñавно пÑиÑ
одиÑÑÑ Ð¿ÐµÑеноÑиÑÑ Ð´Ð°Ð½Ð½Ñе на диÑк, даже когда вклÑÑена пеÑедаÑа в поÑоке, поÑколÑÐºÑ Ð¿Ð¾Ñог памÑÑи Ñже пÑевÑÑен, но полнÑй коÑÑеж еÑÑ Ð½Ðµ декодиÑован, напÑÐ¸Ð¼ÐµÑ Ð´ÐµÐºÐ¾Ð´Ð¸Ñовано добавление ÑолÑко в ÑаблиÑÑ TOAST, но не в оÑновнÑÑ ÑаблиÑÑ.
Ðаже пÑи пеÑедаÑе в поÑоке болÑÑÐ¸Ñ ÑÑанзакÑий Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¿ÑименÑÑÑÑÑ Ð² поÑÑдке ÑикÑаÑии, ÑÐ¾Ñ ÑанÑÑ Ñе же гаÑанÑии, ÑÑо и не в поÑоковом Ñежиме.