SAVEPOINT
SAVEPOINT â опÑеделиÑÑ Ð½Ð¾Ð²ÑÑ ÑоÑÐºÑ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² ÑекÑÑей ÑÑанзакÑии
СинÑакÑиÑ
SAVEPOINT имÑ_ÑоÑки_ÑоÑ
ÑанениÑÐпиÑание
SAVEPOINT ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð½Ð¾Ð²ÑÑ ÑоÑÐºÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² ÑекÑÑей ÑÑанзакÑии.
ТоÑка ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ â ÑÑо ÑпеÑиалÑÐ½Ð°Ñ Ð¾ÑмеÑка внÑÑÑи ÑÑанзакÑии, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾ÑкаÑиÑÑ Ð²Ñе командÑ, вÑполненнÑе поÑле неÑ, и воÑÑÑановиÑÑ Ñаким обÑазом ÑоÑÑоÑние на Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑÑановки ÑÑой ÑоÑки.
ÐаÑамеÑÑÑ
имÑ_ÑоÑки_ÑÐ¾Ñ ÑанениÑÐмÑ, назнаÑаемое новой ÑоÑке ÑÐ¾Ñ ÑанениÑ. Ранее ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑоÑка Ñ Ñаким именем оказÑваеÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпной, пока не бÑдÑÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ñ ÑÑÑановленнÑе позже одноимÑннÑе ÑоÑки.
ÐÑимеÑаниÑ
ÐÐ»Ñ Ð¾ÑкаÑа к ÑÑÑановленной ÑоÑке ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿ÑедназнаÑена команда ROLLBACK TO SAVEPOINT. ЧÑÐ¾Ð±Ñ ÑниÑÑожиÑÑ ÑоÑÐºÑ ÑÐ¾Ñ ÑанениÑ, ÑÐ¾Ñ ÑанÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, пÑоизведÑннÑе поÑле Ñого, как она бÑла ÑÑÑановлена, пÑименÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° RELEASE SAVEPOINT.
ТоÑки ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑолÑко внÑÑÑи блока ÑÑанзакÑии. Родной ÑÑанзакÑии можно опÑеделиÑÑ Ð½ÐµÑколÑко ÑоÑек ÑÐ¾Ñ ÑанениÑ.
ÐÑимеÑÑ
УÑÑановление ÑоÑки ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ заÑем оÑмена дейÑÑÐ²Ð¸Ñ Ð²ÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´, вÑполненнÑÑ Ð¿Ð¾Ñле ÑÑÑановленной ÑоÑки:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;ÐÐ¾ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð²ÑÑÐ°Ð²Ð¸Ñ Ð² ÑаблиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ 1 и 3, но не 2.
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, как ÑÑÑановиÑÑ Ð¸ заÑем ÑниÑÑожиÑÑ ÑоÑÐºÑ ÑÐ¾Ñ ÑанениÑ:
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
COMMIT;ÐÐ°Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð²ÑÑÐ°Ð²Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ 3 и 4.
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, как иÑполÑзоваÑÑ ÑоÑки ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ именем:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
-- оÑÐºÐ°Ñ ÐºÐ¾ вÑоÑой ÑоÑке ÑоÑ
ÑанениÑ
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- вÑвод ÑÑÑок 1 и 2
-- оÑвобождение вÑоÑой ÑоÑки ÑоÑ
ÑанениÑ
RELEASE SAVEPOINT my_savepoint;
-- оÑÐºÐ°Ñ Ðº пеÑвой ÑоÑке ÑоÑ
ÑанениÑ
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- вÑвод ÑолÑко ÑÑÑоки 1
COMMIT;ÐÐ°Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ ÑнаÑала оÑкаÑÐ¸Ñ ÑÑÑÐ¾ÐºÑ 3, заÑем ÑÑÑÐ¾ÐºÑ 2.
СовмеÑÑимоÑÑÑ
СÑандаÑÑ SQL ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÑоÑка ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑниÑÑожалаÑÑ Ð°Ð²ÑомаÑиÑеÑки, когда ÑÑÑанавливаеÑÑÑ Ð´ÑÑÐ³Ð°Ñ ÑоÑка ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñ Ñем же именем. Ð PostgreSQL ÑÑаÑÐ°Ñ ÑоÑка ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾ÑÑаÑÑÑÑ, Ñ
оÑÑ Ð¿Ñи оÑкаÑе или ÑниÑÑожении бÑÐ´ÐµÑ Ð²ÑбиÑаÑÑÑÑ ÑолÑко ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ. (ÐоÑле ÑниÑÑÐ¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней ÑоÑки командой RELEASE SAVEPOINT доÑÑÑпной Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ ROLLBACK TO SAVEPOINT и RELEASE SAVEPOINT ÑÑановиÑÑÑ ÑледÑÑÑаÑ.) РоÑÑалÑном опеÑаÑÐ¾Ñ SAVEPOINT полноÑÑÑÑ ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ.