PREPARE TRANSACTION
PREPARE TRANSACTION â подгоÑовиÑÑ ÑекÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð²ÑÑ Ñазной ÑикÑаÑии
СинÑакÑиÑ
PREPARE TRANSACTION id_ÑÑанзакÑииÐпиÑание
PREPARE TRANSACTION подгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑекÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð²ÑÑ
Ñазной ÑикÑаÑии. ÐоÑле ÑÑой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑÑанзакÑÐ¸Ñ Ð¿ÐµÑеÑÑаÑÑ Ð±ÑÑÑ ÑвÑзанной Ñ ÑекÑÑим ÑеанÑом; ÐµÑ ÑоÑÑоÑние полноÑÑÑÑ ÑоÑ
ÑанÑеÑÑÑ Ð½Ð° диÑке, и еÑÑÑ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ°Ñ Ð²ÐµÑоÑÑноÑÑÑ, ÑÑо она бÑÐ´ÐµÑ ÑÑпеÑно заÑикÑиÑована, даже еÑли до ÑÑого вÑемени ÑабоÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
бÑÐ´ÐµÑ Ð¿ÑеÑвана аваÑийно.
ÐодгоÑовленнÑÑ ÑÑанзакÑÐ¸Ñ Ð·Ð°Ñем можно заÑикÑиÑоваÑÑ Ð¸Ð»Ð¸ оÑмениÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ COMMIT PREPARED и ROLLBACK PREPARED, ÑооÑвеÑÑÑвенно. ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ Ð¸Ð· лÑбого ÑеанÑа, не ÑолÑко из Ñого, в коÑоÑом ÑÑа ÑÑанзакÑÐ¸Ñ ÑоздавалаÑÑ.
С ÑоÑки зÑÐµÐ½Ð¸Ñ ÑеанÑа, вÑполнÑÑÑего командÑ, PREPARE TRANSACTION не оÑлиÑаеÑÑÑ Ð¾Ñ ROLLBACK: поÑле ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ акÑивна Ð½Ð¸ÐºÐ°ÐºÐ°Ñ ÑÑанзакÑиÑ, а ÑезÑлÑÑÐ°Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленной ÑÑанзакÑии ÑÑановиÑÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñм (Ðн окажеÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñм Ñнова, еÑли ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑована.)
ÐÑли пÑи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ PREPARE TRANSACTION по какой-Ñо пÑиÑине пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ñбой, команда дейÑÑвÑÐµÑ ÐºÐ°Ðº ROLLBACK: ÑекÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¾ÑкаÑÑваеÑÑÑ.
ÐаÑамеÑÑÑ
id_ÑÑанзакÑииÐÑоизволÑнÑй иденÑиÑикаÑоÑ, по коÑоÑÐ¾Ð¼Ñ Ð·Ð°Ñем на ÑÑÑ ÑÑанзакÑÐ¸Ñ Ð±ÑдÑÑ ÑÑÑлаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
COMMIT PREPAREDилиROLLBACK PREPARED. ÐденÑиÑикаÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ задаваÑÑÑÑ ÑÑÑоковой конÑÑанÑой не длиннее 200 Ð±Ð°Ð¹Ñ Ð¸ должен оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов лÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑÑ Ð½Ð° даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑанзакÑий.
ÐамеÑаниÑ
PREPARE TRANSACTION не пÑедназнаÑена Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² пÑиложениÑÑ
или инÑеÑакÑивнÑÑ
ÑеанÑаÑ
. ÐÑ Ð·Ð°Ð´Ð°Ñа â даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²Ð½ÐµÑÐ½ÐµÐ¼Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑÑ ÑÑанзакÑий вÑполнÑÑÑ Ð°ÑомаÑнÑе глобалÑнÑе ÑÑанзакÑии, оÑ
ваÑÑваÑÑие неÑколÑко баз даннÑÑ
или дÑÑгие ÑÑанзакÑионнÑе ÑеÑÑÑÑÑ. ÐбÑÑно пÑименÑÑÑ PREPARE TRANSACTION ÑледÑÐµÑ ÑолÑко пÑи ÑазÑабоÑке ÑобÑÑвенного менеджеÑа ÑÑанзакÑий.
ÐÑа команда должна вÑполнÑÑÑÑÑ Ð²Ð½ÑÑÑи блока ÑÑанзакÑии. ÐаÑÐ¸Ð½Ð°ÐµÑ Ð±Ð»Ð¾Ðº ÑÑанзакÑии команда BEGIN.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° PREPARE неÑпоÑобна подгоÑавливаÑÑ ÑÑанзакÑии, в коÑоÑÑÑ
вÑполнÑлиÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо дейÑÑÐ²Ð¸Ñ Ñ Ð²ÑеменнÑми ÑаблиÑами, ÑоздавалиÑÑ ÐºÑÑÑоÑÑ WITH HOLD либо вÑполнÑлиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ LISTEN, UNLISTEN или NOTIFY. ÐÑи ÑÑнкÑии ÑлиÑком ÑеÑно ÑвÑÐ·Ð°Ð½Ñ Ñ ÑекÑÑим ÑеанÑом, Ñак ÑÑо в подгоÑовленной ÑÑанзакÑии они не бÑли Ð±Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ.
ÐÑли ÑÑанзакÑÐ¸Ñ Ð¼ÐµÐ½ÑÐµÑ ÐºÐ°ÐºÐ¸Ðµ-либо паÑамеÑÑÑ Ð²Ñемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ SET (без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ LOCAL), иÑ
знаÑÐµÐ½Ð¸Ñ ÑоÑ
ÑанÑÑÑÑÑ Ð¿Ð¾Ñле PREPARE TRANSACTION и не завиÑÑÑ Ð¾Ñ Ð¿Ð¾ÑледÑÑÑиÑ
команд COMMIT PREPARED и ROLLBACK PREPARED. Так ÑÑо в ÑÑом оÑноÑении PREPARE TRANSACTION болÑÑе поÑ
ожа на COMMIT, Ñем на ROLLBACK.
ÐÑе ÑÑÑеÑÑвÑÑÑие в ÑекÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑе ÑÑанзакÑии показÑваÑÑÑÑ Ð² ÑиÑÑемном пÑедÑÑавлении pg_prepared_xacts.
Ðнимание
ÐÑÑавлÑÑÑ ÑÑанзакÑии в подгоÑовленном ÑоÑÑоÑнии на долгое вÑÐµÐ¼Ñ Ð½Ðµ ÑекомендÑеÑÑÑ. ÐÑо повлиÑÐµÑ Ð½Ð° ÑпоÑобноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM вÑÑвобождаÑÑ Ð¿ÑоÑÑÑанÑÑво, а в кÑайнем ÑлÑÑае Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к оÑклÑÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð·Ð°ÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ ID ÑÑанзакÑий (Ñм. ÐодÑаздел 23.1.5). Также ÑÑÑиÑе, ÑÑо ÑÑанзакÑÐ¸Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÑдеÑживаÑÑ Ð²Ñе Ñвои блокиÑовки. ÐÑо Ñделано Ñ ÑаÑÑÑÑом на Ñо, ÑÑо подгоÑÐ¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑована или оÑменена как ÑолÑко внеÑний Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ ÑÑанзакÑий ÑбедиÑÑÑ, ÑÑо вÑе дÑÑгие Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñак же гоÑÐ¾Ð²Ñ Ðº ÑикÑаÑии.
РоÑÑÑÑÑÑвие наÑÑÑоенного внеÑнего менеджеÑа ÑÑанзакÑий, коÑоÑÑй Ð±Ñ Ð¾ÑÑлеживал подгоÑовленнÑе ÑÑанзакÑии и ÑвоевÑеменно закÑÑвал Ð¸Ñ , лÑÑÑе вовÑе оÑклÑÑиÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑÑ ÑÑанзакÑий, ÑÑÑановив max_prepared_transactions ÑавнÑм нÑлÑ. ÐÑо не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑлÑÑайно ÑоздаÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑе ÑÑанзакÑии, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð·Ð°Ð±ÑÑÑ Ð¸ в конÑе конÑов ÑÑанÑÑ Ð¿ÑиÑиной пÑоблем.
ÐÑимеÑÑ
ТекÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑавливаеÑÑÑ Ð´Ð»Ñ Ð´Ð²ÑÑ
Ñазной ÑикÑаÑии, пÑи ÑÑом ей назнаÑаеÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ foobar:
PREPARE TRANSACTION 'foobar';
СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ PREPARE TRANSACTION ÑвлÑеÑÑÑ ÑаÑÑиÑением Postgres Pro. Ðн пÑедназнаÑен Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÐµÑними ÑиÑÑемами ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми, некоÑоÑÑе из коÑоÑÑÑ
ÑабоÑаÑÑ Ð¿Ð¾ ÑÑандаÑÑам (напÑимеÑ, X/Open XA), но ÑÑоÑона SQL в ÑÑиÑ
ÑиÑÑемаÑ
не ÑÑандаÑÑизиÑована.