42.8. УпÑавление ÑÑанзакÑиÑми
РпÑоÑедÑÑаÑ
, вÑзÑваемÑÑ
командой CALL, а Ñакже в анонимнÑÑ
блокаÑ
кода (в команде DO) можно завеÑÑаÑÑ ÑÑанзакÑии, вÑполнÑÑ COMMIT и ROLLBACK. ÐоÑле завеÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии ÑÑими командами Ð½Ð¾Ð²Ð°Ñ Ð±ÑÐ´ÐµÑ Ð½Ð°ÑаÑа авÑомаÑиÑеÑки, поÑÑÐ¾Ð¼Ñ Ð¾ÑделÑной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ START TRANSACTION неÑ. (ÐамеÑÑÑе, ÑÑо ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ BEGIN и END в PL/pgSQL имеÑÑ Ð´ÑÑгой ÑмÑÑл.)
ÐÑимеÑ:
CREATE PROCEDURE transaction_test1()
LANGUAGE plpgsql
AS $$
BEGIN
FOR i IN 0..9 LOOP
INSERT INTO test1 (a) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
END;
$$;
CALL transaction_test1();ÐÐ¾Ð²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð½Ð°ÑинаеÑÑÑ Ñ Ñеми Ñ
аÑакÑеÑиÑÑиками, в ÑаÑÑноÑÑи, ÑÑовнем изолÑÑии, коÑоÑÑе ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð´Ð»Ñ ÑÑанзакÑий по ÑмолÑаниÑ. Ð ÑлÑÑаÑÑ
, когда ÑÑанзакÑии ÑикÑиÑÑÑÑÑÑ Ð² Ñикле, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдобнее авÑомаÑиÑеÑки наÑинаÑÑ ÑледÑÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ñ Ñеми же Ñ
аÑакÑеÑиÑÑиками, ÑÑо Ð¸Ð¼ÐµÐµÑ Ð¿ÑедÑдÑÑаÑ. ÐÑо позволÑÑÑ ÑеализоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COMMIT AND CHAIN и ROLLBACK AND CHAIN.
УпÑавление ÑÑанзакÑиÑми возможно ÑолÑко в вÑзоваÑ
CALL или DO в коде веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ во вложеннÑÑ
CALL или DO без дÑÑгиÑ
пÑомежÑÑоÑнÑÑ
команд. ÐапÑимеÑ, в ÑÑеке вÑзовов CALL proc1() â CALL proc2() â CALL proc3() вÑоÑÐ°Ñ Ð¸ ÑÑеÑÑÑ Ð¿ÑоÑедÑÑÑ Ð¼Ð¾Ð³ÑÑ ÑпÑавлÑÑÑ ÑÑанзакÑиÑми. Ðо в ÑÑеке CALL proc1() â SELECT func2() â CALL proc3() поÑледнÑÑ Ð¿ÑоÑедÑÑа лиÑена ÑÑой возможноÑÑи из-за пÑомежÑÑоÑного SELECT.
Циклам Ñ ÐºÑÑÑоÑами пÑиÑÑÑи некоÑоÑÑе оÑобенноÑÑи. РаÑÑмоÑÑиÑе ÑÑÐ¾Ñ Ð¿ÑимеÑ:
CREATE PROCEDURE transaction_test2()
LANGUAGE plpgsql
AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT * FROM test2 ORDER BY x LOOP
INSERT INTO test1 (a) VALUES (r.x);
COMMIT;
END LOOP;
END;
$$;
CALL transaction_test2(); ÐбÑÑно кÑÑÑоÑÑ Ð°Ð²ÑомаÑиÑеÑки закÑÑваÑÑÑÑ Ð¿Ñи ÑикÑиÑовании ÑÑанзакÑии. Ðднако кÑÑÑоÑ, ÑоздаваемÑй внÑÑÑи Ñикла подобнÑм обÑазом, авÑомаÑиÑеÑки пÑеобÑазÑеÑÑÑ Ð² ÑдеÑживаемÑй кÑÑÑÐ¾Ñ Ð¿ÐµÑвой командой COMMIT или ROLLBACK. ÐÑо ознаÑаеÑ, ÑÑо кÑÑÑÐ¾Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð²ÑÑиÑлÑеÑÑÑ Ð¿Ñи вÑполнении пеÑвой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COMMIT или ROLLBACK, а не Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ оÑеÑедной ÑÑÑоки. ÐÑи ÑÑом он авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ð¾Ñле Ñикла, Ñак ÑÑо ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿ÑакÑиÑеÑки незамеÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми не допÑÑкаÑÑÑÑ Ð² ÑиклаÑ
Ñ ÐºÑÑÑоÑом, коÑоÑÑми ÑпÑавлÑÑÑ Ð·Ð°Ð¿ÑоÑÑ, пÑоизводÑÑие не ÑолÑко ÑÑение, но и модиÑикаÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ
(напÑимеÑ, UPDATE ... RETURNING).
ТÑанзакÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ð²Ð½ÑÑÑи блока Ñ Ð¾Ð±ÑабоÑÑиками иÑклÑÑений.