28.4. ÐÑÐ¸Ð½Ñ Ñонное подÑвеÑждение ÑÑанзакÑий #
ÐÑÐ¸Ð½Ñ ÑÐ¾Ð½Ð½Ð°Ñ ÑикÑаÑÐ¸Ñ â ÑÑо возможноÑÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑ ÑÑанзакÑии бÑÑÑÑее, Ñеной Ñого, ÑÑо в ÑлÑÑае кÑÐ°Ñ Ð° СУÐРпоÑледние ÑÑанзакÑии могÑÑ Ð±ÑÑÑ Ð¿Ð¾ÑеÑÑнÑ. ÐÐ»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð¿Ñиложений Ñакой компÑомиÑÑ Ð¿Ñиемлем.
Ðак опиÑано в пÑедÑдÑÑей ÑаÑÑи, подÑвеÑждение ÑÑанзакÑии обÑÑно ÑÐ¸Ð½Ñ Ñонное: ÑеÑÐ²ÐµÑ Ð¶Ð´ÑÑ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей WAL ÑÑанзакÑии в поÑÑоÑнном Ñ ÑанилиÑе, пÑежде Ñем ÑообÑиÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¾Ð± ÑÑпеÑном завеÑÑении. Таким обÑазом, клиенÑÑ Ð³Ð°ÑанÑиÑÑеÑÑÑ, ÑÑо ÑÑанзакÑиÑ, коÑоÑÑÑ Ð¿Ð¾Ð´ÑвеÑдил ÑеÑвеÑ, бÑÐ´ÐµÑ Ð·Ð°ÑиÑена, даже еÑли ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле ÑÑого пÑоизойдÑÑ ÐºÑÐ°Ñ ÑеÑвеÑа. Ðднако Ð´Ð»Ñ ÐºÐ¾ÑоÑÐºÐ¸Ñ ÑÑанзакÑий Ð´Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑжка бÑÐ´ÐµÑ Ð¾Ñновной ÑоÑÑавлÑÑÑей обÑего вÑемени ÑÑанзакÑии. Ð Ñежиме аÑÐ¸Ð½Ñ Ñонного подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑеÑÐ²ÐµÑ ÑообÑÐ°ÐµÑ Ð¾Ð± ÑÑпеÑном завеÑÑении ÑÑазÑ, как ÑолÑко ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑена логиÑеÑки, пÑежде Ñем ÑгенеÑиÑованнÑе запиÑи WAL ÑакÑиÑеÑки бÑдÑÑ Ð·Ð°Ð¿Ð¸ÑÐ°Ð½Ñ Ð½Ð° диÑк. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¿Ñи вÑполнении неболÑÑÐ¸Ñ ÑÑанзакÑий.
ÐÑÐ¸Ð½Ñ Ñонное подÑвеÑждение ÑÑанзакÑий пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑиÑÐºÑ Ð¿Ð¾ÑеÑи даннÑÑ . СÑÑеÑÑвÑÐµÑ ÐºÐ¾ÑоÑкое окно Ð¼ÐµÐ¶Ð´Ñ Ð¾ÑÑÑÑом о завеÑÑении ÑÑанзакÑии Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа и вÑеменем, когда ÑÑанзакÑÐ¸Ñ ÑеалÑно подÑвеÑждена (Ñ. е. гаÑанÑиÑÑеÑÑÑ, ÑÑо она не бÑÐ´ÐµÑ Ð¿Ð¾ÑеÑÑна в ÑлÑÑае кÑÐ°Ñ Ð° ÑеÑвеÑа). Таким обÑазом, аÑÐ¸Ð½Ñ Ñонное подÑвеÑждение ÑÑанзакÑий не должно иÑполÑзоваÑÑÑÑ, еÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð²Ð½ÐµÑние дейÑÑвиÑ, опиÑаÑÑÑ Ð½Ð° пÑедположение, ÑÑо ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ ÑÐ¾Ñ Ñанена. ÐапÑимеÑ, банк конеÑно не должен иÑполÑзоваÑÑ Ð°ÑÐ¸Ð½Ñ Ñонное подÑвеÑждение Ð´Ð»Ñ ÑÑанзакÑий в банкомаÑÐ°Ñ , вÑдаÑÑÐ¸Ñ Ð½Ð°Ð»Ð¸ÑнÑе. Ðо во Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑлÑÑаÑÑ , ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº жÑÑналиÑование ÑобÑÑий, ÑÑÐ¾Ð»Ñ ÑеÑÑÑÐ·Ð½Ð°Ñ Ð³Ð°ÑанÑÐ¸Ñ ÑÐ¾Ñ ÑанноÑÑи даннÑÑ Ð½Ðµ нÑжна.
РиÑк поÑеÑи даннÑÑ Ð¿Ñи иÑполÑзовании аÑÐ¸Ð½Ñ Ñонного подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑÑанзакÑий â ÑÑо не ÑиÑк повÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли ÑлÑÑилÑÑ ÐºÑÐ°Ñ Ð¡Ð£ÐÐ, она бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановлена пÑÑÑм воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ WAL до поÑледней запиÑи, коÑоÑÐ°Ñ Ð±Ñла запиÑана на диÑк. Таким обÑазом, бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановлено ÑелоÑÑное ÑоÑÑоÑние СУÐÐ, но лÑбÑе ÑÑанзакÑии, коÑоÑÑе еÑÑ Ð½Ðµ бÑли ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ñ Ð½Ð° диÑк, в ÑÑом ÑоÑÑоÑнии не бÑдÑÑ Ð¾ÑÑаженÑ. ЧиÑÑÑй ÑÑÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð·Ð°ÐºÐ»ÑÑаÑÑÑÑ Ð² поÑеÑе неÑколÑÐºÐ¸Ñ Ð¿Ð¾ÑÐ»ÐµÐ´Ð½Ð¸Ñ ÑÑанзакÑий. ÐоÑколÑÐºÑ ÑÑанзакÑии воÑпÑоизводÑÑÑÑ Ð² Ñом же поÑÑдке, в коÑоÑом подÑвеÑждалиÑÑ, воÑпÑоизведение не наÑÑÑÐ°ÐµÑ ÑелоÑÑноÑÑÑ â напÑимеÑ, еÑли ÑÑанзакÑÐ¸Ñ Â«B» вÑполнила изменениÑ, коÑоÑÑе влиÑÑÑ Ð½Ð° пÑедÑдÑÑÑÑ ÑÑанзакÑÐ¸Ñ Â«A», Ñо не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакого, ÑÑо изменениÑ, вÑполненнÑе «A» бÑли поÑеÑÑнÑ, а изменениÑ, внеÑÑннÑе «B» ÑÐ¾Ñ ÑаненÑ.
ÐолÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ Ñежим подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑанзакÑии, Ñак ÑÑо возможен конкÑÑенÑнÑй запÑÑк ÑÑанзакÑий в ÑинÑ
Ñонном и аÑинÑ
Ñонном Ñежиме. ÐÑо позволÑÐµÑ Ð´Ð¾ÑÑиÑÑ Ð³Ð¸Ð±ÐºÐ¾Ð³Ð¾ компÑомиÑÑа Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ Ð¸ конеÑно надÑжноÑÑÑÑ ÑÑанзакÑий. Режим подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑÑанзакÑий ÑпÑавлÑеÑÑÑ Ð¿Ð°ÑамеÑÑом synchronous_commit, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн лÑбÑм из ÑпоÑобов, пÑигоднÑм Ð´Ð»Ñ ÑÑÑановки паÑамеÑÑов конÑигÑÑаÑии. Режим, иÑполÑзÑемÑй Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹-либо конкÑеÑной ÑÑанзакÑии, завиÑÐ¸Ñ Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ synchronous_commit, коÑоÑое дейÑÑвÑÐµÑ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑой ÑÑанзакÑии.
ÐекоÑоÑÑе командÑ, напÑÐ¸Ð¼ÐµÑ DROP TABLE, пÑинÑдиÑелÑно запÑÑкаÑÑ ÑинÑ
Ñонное подÑвеÑждение ÑÑанзакÑии, незавиÑимо Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ synchronous_commit. ÐÑо Ñделано Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÑÑ ÑвеÑенноÑÑÑ Ð² ÑелоÑÑноÑÑи даннÑÑ
Ð¼ÐµÐ¶Ð´Ñ Ñайловой ÑиÑÑемой ÑеÑвеÑа и логиÑеÑким ÑоÑÑоÑнием Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐомандÑ, коÑоÑÑе поддеÑживаÑÑ Ð´Ð²ÑÑ
Ñазное подÑвеÑждение ÑÑанзакÑий, Ñакие как PREPARE TRANSACTION, Ñакже вÑегда ÑинÑ
ÑоннÑе.
ÐÑли во вÑÐµÐ¼Ñ Ð¾ÐºÐ½Ð° ÑиÑка Ð¼ÐµÐ¶Ð´Ñ Ð°ÑинÑ
ÑоннÑм подÑвеÑждением ÑÑанзакÑии и ÑоÑ
Ñанением на диÑк запиÑей WAL, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÐºÑаÑ
СУÐÐ, Ñо изменениÑ, ÑделаннÑе во вÑÐµÐ¼Ñ ÑÑой ÑÑанзакÑии бÑдÑÑ Ð¿Ð¾ÑеÑÑнÑ. ÐÑодолжиÑелÑноÑÑÑ Ð¾ÐºÐ½Ð° ÑиÑка огÑаниÑена, поÑÐ¾Ð¼Ñ ÑÑо ÑоновÑй пÑоÑеÑÑ («WAL writer»), ÑоÑ
ÑанÑÐµÑ Ð½Ðµ запиÑаннÑе запиÑи WAL на диÑк каждÑе wal_writer_delay миллиÑекÑнд. ФакÑиÑеÑки, макÑималÑÐ½Ð°Ñ Ð¿ÑодолжиÑелÑноÑÑÑ Ð¾ÐºÐ½Ð° ÑиÑка ÑоÑÑавлÑÐµÑ ÑÑÑÑ
кÑаÑное знаÑение wal_writer_delay, поÑÐ¾Ð¼Ñ ÑÑо WAL writer ÑазÑабоÑан Ñак, ÑÑÐ¾Ð±Ñ ÑÑÐ°Ð·Ñ ÑоÑ
ÑанÑÑÑ ÑелÑе ÑÑÑаниÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿ÐµÑиодов занÑÑоÑÑи.
Ðнимание
Режим немедленного завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ (immediate) ÑквиваленÑен кÑÐ°Ñ Ñ ÑеÑвеÑа и пÑиведÑÑ, Ñаким обÑазом, к поÑеÑе вÑÐµÑ Ð½Ðµ ÑÐ¾Ñ ÑанÑннÑÑ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ ÑÑанзакÑий.
ÐÑинÑ
Ñонное подÑвеÑждение ÑÑанзакÑий пÑедоÑÑавлÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ, коÑоÑое оÑлиÑаеÑÑÑ Ð¾Ñ Ñого, ÑÑо ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑановке паÑамеÑÑа fsync = off. ÐаÑÑÑойка fsync каÑаеÑÑÑ Ð²Ñего ÑеÑвеÑа и Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ вÑеÑ
ÑÑанзакÑий. Ðна вÑклÑÑÐ°ÐµÑ Ð²ÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð²Ð½ÑÑÑи Postgres Pro, коÑоÑÐ°Ñ Ð¿ÑÑаеÑÑÑ ÑинÑ
ÑонизиÑоваÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾ÑделÑнÑÑ
поÑÑий в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
и, Ñаким обÑазом, кÑаÑ
ÑиÑÑÐµÐ¼Ñ (обÑÑловленнÑй оÑказом аппаÑаÑного обеÑпеÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ опеÑаÑионной ÑиÑÑемÑ, коÑоÑÑй не ÑвлÑеÑÑÑ Ñбоем Ñамой СУÐÐ Postgres Pro ) Ð¼Ð¾Ð¶ÐµÑ Ð² ÑезÑлÑÑаÑе пÑивеÑÑи к повÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. Ðо многиÑ
ÑлÑÑаÑÑ
, аÑинÑ
Ñонное подÑвеÑждение ÑÑанзакÑий пÑедоÑÑавлÑÐµÑ Ð»ÑÑÑÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, Ñем Ñо, ÑÑо можно полÑÑиÑÑ Ð²ÑклÑÑением fsync, но без ÑиÑка повÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
.
commit_delay Ñакже вÑглÑÐ´Ð¸Ñ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ñ
оже на аÑинÑ
Ñонное подÑвеÑждение ÑÑанзакÑий, но по ÑÑÑи ÑÑо ÑвлÑеÑÑÑ Ð¼ÐµÑодом ÑинÑ
Ñонного подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑÑанзакÑий (ÑакÑиÑеÑки, во вÑÐµÐ¼Ñ Ð°ÑинÑ
ÑоннÑÑ
ÑÑанзакÑий commit_delay игноÑиÑÑеÑÑÑ). commit_delay пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº задеÑжке ÑолÑко пеÑед Ñем, как ÑинÑ
ÑÐ¾Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð¿ÑÑаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð´Ð°Ð½Ð½Ñе WAL на диÑк, в надежде, ÑÑо одиноÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ, вÑполнÑÐµÐ¼Ð°Ñ Ð½Ð° Ð¾Ð´Ð½Ñ ÑакÑÑ ÑÑанзакÑиÑ, ÑÐ¼Ð¾Ð¶ÐµÑ Ñакже обÑлÑжиÑÑ Ð´ÑÑгие ÑÑанзакÑии, коÑоÑÑе подÑвеÑждаÑÑÑÑ Ð¿ÑиблизиÑелÑно в ÑÑо же вÑемÑ. УÑÑÐ°Ð½Ð¾Ð²ÐºÑ ÑÑого паÑамеÑÑа можно ÑаÑÑмаÑÑиваÑÑ ÐºÐ°Ðº ÑпоÑоб ÑвелиÑÐµÐ½Ð¸Ñ Ð¿ÑомежÑÑка вÑемени, в ÑеÑение коÑоÑого ÑÑанзакÑии гÑÑппиÑÑÑÑÑÑ Ð´Ð»Ñ ÐµÐ´Ð¸Ð½Ð¾Ð²Ñеменной запиÑи на диÑк. ÐÑо ÑаÑпÑеделÑÐµÑ ÑÑоимоÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ð¼ÐµÐ¶Ð´Ñ Ð½ÐµÑколÑкими ÑÑанзакÑиÑми.