13.5. ÐбÑабоÑка Ñбоев ÑеÑиализаÑии #
Ðа ÑÑовнÑÑ
изолÑÑии Repeatable Read и Serializable могÑÑ Ð²ÑдаваÑÑÑÑ Ð¾Ñибки Ñ ÑелÑÑ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ð¹ ÑеÑиализаÑии. Ðак оÑмеÑалоÑÑ Ñанее, пÑиложениÑ, иÑполÑзÑÑÑие ÑÑи ÑÑовни, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð¿Ð¾Ð²ÑоÑиÑÑ ÑÑанзакÑии, завеÑÑивÑиеÑÑ Ñбоем из-за оÑибок ÑеÑиализаÑии. ТекÑÑ Ñакого ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке Ð¼Ð¾Ð¶ÐµÑ Ð²Ð°ÑÑиÑоваÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
обÑÑоÑÑелÑÑÑв, но код SQLSTATE вÑегда бÑÐ´ÐµÑ 40001 (serialization_failure).
Также Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл повÑоÑÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð² ÑлÑÑае оÑибок взаимоблокиÑовки. Такие оÑибки имеÑÑ ÐºÐ¾Ð´ SQLSTATE 40P01 (deadlock_detected).
РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
Ñакже ÑелеÑообÑазно повÑоÑÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¿Ð¾Ñле оÑибок ÑникалÑноÑÑи клÑÑа, коÑоÑÑе имеÑÑ ÐºÐ¾Ð´ SQLSTATE 23505 (unique_violation), и оÑибок наÑÑÑÐµÐ½Ð¸Ñ Ð¸ÑклÑÑениÑ, коÑоÑÑе имеÑÑ ÐºÐ¾Ð´ SQLSTATE 23P01 (exclusion_violation). ÐапÑимеÑ, еÑли пÑиложение вÑбиÑÐ°ÐµÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑение Ð´Ð»Ñ ÑÑолбÑа пеÑвиÑного клÑÑа, пÑедваÑиÑелÑно вÑÑÑнив, какие знаÑÐµÐ½Ð¸Ñ Ñже еÑÑÑ, оно Ð¼Ð¾Ð¶ÐµÑ ÑÑолкнÑÑÑÑÑ Ñ Ð¾Ñибкой ÑникалÑноÑÑи клÑÑа, поÑÐ¾Ð¼Ñ ÑÑо дÑÑгой ÑкземплÑÑ ÑÑого же пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð²Ñеменно вÑбÑал Ñо же знаÑение. Ðо ÑÑÑи, ÑÑо оÑибка ÑеÑиализаÑии, но ÑеÑÐ²ÐµÑ Ð½Ðµ обнаÑÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐµÑ ÐºÐ°Ðº ÑаковÑÑ, поÑÐ¾Ð¼Ñ ÑÑо он не Ð¼Ð¾Ð¶ÐµÑ Â«Ð²Ð¸Ð´ÐµÑÑ» ÑвÑÐ·Ñ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑм знаÑением и пÑедÑдÑÑим ÑÑением. ÐÑÑÑ Ñакже некоÑоÑÑе оÑобÑе ÑлÑÑаи, когда ÑеÑÐ²ÐµÑ Ð²ÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ ÑникалÑного клÑÑа или наÑÑÑÐµÐ½Ð¸Ñ Ð¸ÑклÑÑениÑ, даже еÑли Ñ Ð½ÐµÐ³Ð¾ в пÑинÑипе доÑÑаÑоÑно инÑоÑмаÑии, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, ÑÑо оÑновной пÑиÑиной ÑвлÑеÑÑÑ Ð¿Ñоблема ÑеÑиализаÑии. Тогда как запÑоÑÑ, вÑзвавÑие оÑибки serialization_failure, ÑекомендÑеÑÑÑ Ð¿ÑоÑÑо повÑоÑÑÑÑ, ÑÑо не ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° запÑоÑÑ, завеÑÑаÑÑиеÑÑ Ð¾Ñибками Ñ Ð´ÑÑгими кодами, поÑколÑÐºÑ Ñакие оÑибки могÑÑ ÑвидеÑелÑÑÑвоваÑÑ Ð¾ поÑÑоÑннÑÑ
пÑоблемаÑ
, а не о вÑеменнÑÑ
ÑбоÑÑ
.
ÐовÑоÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð²Ð°Ð¶Ð½Ð¾ Ñеликом, вклÑÑÐ°Ñ Ð²ÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ, коÑоÑÐ°Ñ ÑеÑаеÑ, какой SQL вÑдаваÑÑ Ð¸/или какие знаÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзоваÑÑ. Postgres Pro не пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑÑедÑÑва авÑомаÑиÑеÑкого повÑоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, Ñак как не Ð¼Ð¾Ð¶ÐµÑ Ð³Ð°ÑанÑиÑоваÑÑ Ð¸Ñ Ð¿ÑавилÑноÑÑÑ.
ÐовÑоÑение ÑÑанзакÑии не гаÑанÑиÑÑеÑ, ÑÑо ÑÐ°ÐºÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑена ÑÑпеÑно; Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð½ÐµÑколÑко повÑоÑнÑÑ Ð¿Ð¾Ð¿ÑÑок. Ðогда ÑÑÐ¾Ð²ÐµÐ½Ñ ÐºÐ¾Ð½ÐºÑÑенÑии оÑÐµÐ½Ñ Ð²ÑÑок, Ð´Ð»Ñ ÑÑпеÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ попÑÑок. Ð ÑлÑÑаÑÑ , когда конÑÐ»Ð¸ÐºÑ ÑвÑзан Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленной ÑÑанзакÑией, ÑазÑеÑиÑÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, пока подгоÑÐ¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑована или оÑменена.