ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT â оÑкаÑиÑÑÑÑ Ðº ÑоÑке ÑÐ¾Ñ ÑанениÑ
СинÑакÑиÑ
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] имÑ_ÑоÑки_ÑоÑ
ÑанениÑÐпиÑание
ÐÑкаÑÑÐ²Ð°ÐµÑ Ð²Ñе командÑ, вÑполненнÑе поÑле ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑки ÑÐ¾Ñ ÑанениÑ. ТоÑка ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾ÑÑаÑÑÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑей и пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно Ñнова оÑкаÑиÑÑÑÑ Ðº ней позже.
ROLLBACK TO SAVEPOINT неÑвно ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð²Ñе ÑоÑки ÑоÑ
ÑанениÑ, ÑÑÑановленнÑе поÑле заданной ÑоÑки.
ÐаÑамеÑÑÑ
имÑ_ÑоÑки_ÑÐ¾Ñ ÑанениÑТоÑка ÑÐ¾Ñ ÑанениÑ, к коÑоÑой нÑжно оÑкаÑиÑÑÑÑ.
ÐÑимеÑаниÑ
ЧÑÐ¾Ð±Ñ ÑниÑÑожиÑÑ ÑоÑÐºÑ ÑÐ¾Ñ ÑанениÑ, не оÑменÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, вÑполненнÑÑ Ð¿Ð¾Ñле неÑ, пÑименÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° RELEASE SAVEPOINT.
Указание имени ÑоÑки ÑÐ¾Ñ ÑанениÑ, не ÑÑÑановленной Ñанее, ÑÑиÑаеÑÑÑ Ð¾Ñибкой.
ÐÑÑÑоÑÑ Ð¿ÑоÑвлÑÑÑ Ð½Ðµ ÑовÑем ÑÑанзакÑионное поведение пÑимениÑелÑно к ÑоÑкам ÑоÑ
ÑанениÑ. ÐÑбой кÑÑÑоÑ, оÑкÑÑÑÑй внÑÑÑи ÑоÑки ÑоÑ
ÑанениÑ, бÑÐ´ÐµÑ Ð·Ð°ÐºÑÑÑ Ð¿Ñи оÑкаÑе к ÑÑой ÑоÑке. ÐÑли Ñанее оÑкÑÑÑÑй кÑÑÑÐ¾Ñ Ð±Ñл пеÑемеÑÑн командой FETCH или MOVE внÑÑÑи ÑоÑки ÑоÑ
ÑанениÑ, к коÑоÑой заÑем пÑоизоÑÑл оÑкаÑ, кÑÑÑÐ¾Ñ Ð¾ÑÑаÑÑÑÑ Ð² Ñой позиÑии, в коÑоÑой он оÑÑалÑÑ Ð¿Ð¾Ñле FETCH (Ñо еÑÑÑ, пеÑемеÑение кÑÑÑоÑа, пÑоизводимое командой FETCH, не оÑкаÑÑваеÑÑÑ). Также пÑи оÑкаÑе не оÑменÑеÑÑÑ Ð¸ закÑÑÑие кÑÑÑоÑа. Ðднако дÑÑгие побоÑнÑе ÑÑÑекÑÑ, вÑзÑваемÑе запÑоÑом кÑÑÑоÑа (напÑимеÑ, побоÑнÑе дейÑÑÐ²Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑивÑÑ
ÑÑнкÑий, вÑзÑваемÑÑ
в запÑоÑе) оÑменÑÑÑÑÑ, еÑли они пÑоизводÑÑÑÑ Ð¿Ð¾Ñле ÑоÑки ÑоÑ
ÑанениÑ, к коÑоÑой заÑем пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾ÑкаÑ. ÐÑÑÑоÑ, вÑполнение коÑоÑого пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑанзакÑии, пеÑеводиÑÑÑ Ð² неÑабоÑее ÑоÑÑоÑние, Ñак ÑÑо даже еÑли воÑÑÑановиÑÑ ÑÑанзакÑиÑ, вÑполнив ROLLBACK TO SAVEPOINT, ÑÑÐ¾Ñ ÐºÑÑÑÐ¾Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ.
ÐÑимеÑÑ
ÐÑмена дейÑÑÐ²Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, вÑполненнÑÑ
поÑле ÑÑÑановки ÑоÑки ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ my_savepoint:
ROLLBACK TO SAVEPOINT my_savepoint;
ÐÑÐºÐ°Ñ Ðº ÑоÑке ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ оÑÑажаеÑÑÑ Ð½Ð° положении кÑÑÑоÑа:
BEGIN;
DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
1
ROLLBACK TO SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
----------
2
COMMIT;СовмеÑÑимоÑÑÑ
Ð ÑÑандаÑÑе SQL говоÑиÑÑÑ, ÑÑо клÑÑевое Ñлово SAVEPOINT ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм, но PostgreSQL и Oracle позволÑÑÑ Ð¾Ð¿ÑÑкаÑÑ ÐµÐ³Ð¾. SQL допÑÑÐºÐ°ÐµÑ WORK, но не TRANSACTION, в каÑеÑÑве избÑÑоÑного Ñлова поÑле ROLLBACK. ÐÑоме Ñого, в SQL еÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное пÑедложение AND [ NO ] CHAIN, коÑоÑое в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑживаеÑÑÑ Ð² PostgreSQL. РоÑÑалÑном ÑÑа команда ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL.