SET TRANSACTION
SET TRANSACTION â ÑÑÑановиÑÑ Ñ Ð°ÑакÑеÑиÑÑики ÑекÑÑей ÑÑанзакÑии
СинÑакÑиÑ
SET TRANSACTIONÑежим_ÑÑанзакÑии[, ...] SET TRANSACTION SNAPSHOTid_ÑнимкаSET SESSION CHARACTERISTICS AS TRANSACTIONÑежим_ÑÑанзакÑии[, ...] ÐдеÑежим_ÑÑанзакÑÐ¸Ð¸Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим: ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
ÐпиÑание
Ðоманда SET TRANSACTION ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñ
аÑакÑеÑиÑÑики ÑекÑÑей ÑÑанзакÑии. Ðа поÑледÑÑÑие ÑÑанзакÑии она не влиÑеÑ. SET SESSION CHARACTERISTICS ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñ
аÑакÑеÑиÑÑики ÑÑанзакÑии по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑиÑ
ÑÑанзакÑий в ÑамкаÑ
ÑеанÑа. ÐаданнÑе по ÑмолÑÐ°Ð½Ð¸Ñ Ñ
аÑакÑеÑиÑÑики заÑем можно пеÑеопÑеделиÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑанзакÑий командой SET TRANSACTION.
Ð Ñ Ð°ÑакÑеÑиÑÑикам ÑÑанзакÑии оÑноÑиÑÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑии, Ñежим доÑÑÑпа ÑÑанзакÑии (ÑÑение/запиÑÑ Ð¸Ð»Ð¸ ÑолÑко ÑÑение) и допÑÑÑимоÑÑÑ ÐµÑ Ð¾ÑкладÑваниÑ. Рдополнение к ним можно вÑбÑаÑÑ Ñнимок, но ÑолÑко Ð´Ð»Ñ ÑекÑÑей ÑÑанзакÑии, не Ð´Ð»Ñ ÑеанÑа по ÑмолÑаниÑ.
УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑии опÑеделÑеÑ, какие даннÑе Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑÑанзакÑиÑ, когда паÑаллелÑно Ñ Ð½ÐµÐ¹ вÑполнÑÑÑÑÑ Ð´ÑÑгие ÑÑанзакÑии:
READ COMMITTEDÐпеÑаÑÐ¾Ñ Ð²Ð¸Ð´Ð¸Ñ ÑолÑко Ñе ÑÑÑоки, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ наÑала его вÑполнениÑ. ÐÑÐ¾Ñ ÑÑÐ¾Ð²ÐµÐ½Ñ ÑÑÑанавливаеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ.
REPEATABLE READÐÑе опеÑаÑоÑÑ ÑекÑÑей ÑÑанзакÑии видÑÑ ÑолÑко Ñе ÑÑÑоки, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿ÐµÑед пеÑвÑм запÑоÑом на вÑбоÑÐºÑ Ð¸Ð»Ð¸ изменение даннÑÑ , вÑполненнÑм в ÑÑой ÑÑанзакÑии.
SERIALIZABLEÐÑе опеÑаÑоÑÑ ÑекÑÑей ÑÑанзакÑии видÑÑ ÑолÑко Ñе ÑÑÑоки, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿ÐµÑед пеÑвÑм запÑоÑом на вÑбоÑÐºÑ Ð¸Ð»Ð¸ изменение даннÑÑ , вÑполненнÑм в ÑÑой ÑÑанзакÑии. ÐÑли наложение опеÑаÑий ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи паÑаллелÑнÑÑ ÑеÑиализÑемÑÑ ÑÑанзакÑий Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑиÑÑаÑии, невозможной пÑи поÑледоваÑелÑном Ð¸Ñ Ð²Ñполнении (когда одна ÑÑанзакÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ð·Ð° дÑÑгой), пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð¹ из ÑÑанзакÑий Ñ Ð¾Ñибкой
serialization_failure(Ñбой ÑеÑиализаÑии).
Ð ÑÑандаÑÑе SQL опÑеделÑн еÑÑ Ð¾Ð´Ð¸Ð½ ÑÑовенÑ, READ UNCOMMITTED. Ð PostgreSQL ÑÑÐ¾Ð²ÐµÐ½Ñ READ UNCOMMITTED обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº READ COMMITTED.
УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑии нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð¾Ñле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÐµÑвого запÑоÑа на вÑбоÑÐºÑ Ð¸Ð»Ð¸ изменение даннÑÑ
(SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH или COPY) в ÑекÑÑей ÑÑанзакÑии. Ðа дополниÑелÑнÑми ÑведениÑми об изолÑÑии ÑÑанзакÑий и ÑпÑавлении паÑаллелÑнÑм доÑÑÑпом обÑаÑиÑеÑÑ Ðº Ðлаве 13.
Режим доÑÑÑпа ÑÑанзакÑии опÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ ÑÑанзакÑÐ¸Ñ ÑолÑко ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе или бÑÐ´ÐµÑ Ð¸ ÑиÑаÑÑ, и пиÑаÑÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ ÑÑение/запиÑÑ. Ð ÑÑанзакÑии без запиÑи запÑеÑаÑÑÑÑ ÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL: INSERT, UPDATE, DELETE, MERGE и COPY FROM, еÑли ÑолÑко ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа не вÑеменнаÑ; лÑбÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE, ALTER и DROP, а Ñакже COMMENT, GRANT, REVOKE, TRUNCATE; кÑоме Ñого, запÑеÑаÑÑÑÑ EXPLAIN ANALYZE и EXECUTE, еÑли команда, коÑоÑÑÑ Ð¾Ð½Ð¸ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполниÑÑ, оÑноÑиÑÑÑ Ðº вÑÑепеÑеÑиÑленнÑм. ÐÑо вÑÑокоÑÑовневое опÑеделение Ñежима ÑолÑко Ð´Ð»Ñ ÑÑениÑ, коÑоÑое в пÑинÑипе не иÑклÑÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð° диÑк.
СвойÑÑво DEFERRABLE оказÑÐ²Ð°ÐµÑ Ð²Ð»Ð¸Ñние, ÑолÑко еÑли ÑÑанзакÑÐ¸Ñ Ð½Ð°Ñ
одиÑÑÑ Ñакже в ÑежимаÑ
SERIALIZABLE и READ ONLY. Ðогда Ð´Ð»Ñ ÑÑанзакÑии ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð²Ñе ÑÑи ÑÑиÑ
ÑвойÑÑва, ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована пÑи пеÑвой попÑÑке полÑÑиÑÑ Ñвой Ñнимок даннÑÑ
, поÑле Ñего она ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð±ÐµÐ· дополниÑелÑнÑÑ
ÑÑилий, обÑÑнÑÑ
Ð´Ð»Ñ Ñежима SERIALIZABLE, и без ÑиÑка пÑивеÑÑи к ÑÐ±Ð¾Ñ ÑеÑиализаÑии или поÑÑÑадаÑÑ Ð¾Ñ Ð½ÐµÐ³Ð¾. ÐÑÐ¾Ñ Ñежим подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð´Ð»Ð¸ÑелÑнÑÑ
опеÑаÑий, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¾ÑÑÑÑов или ÑезеÑвного копиÑованиÑ.
Ðоманда SET TRANSACTION SNAPSHOT позволÑÐµÑ Ð²ÑполниÑÑ Ð½Ð¾Ð²ÑÑ ÑÑанзакÑÐ¸Ñ Ñо Ñнимком даннÑÑ
, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ñже ÑÑÑеÑÑвÑÑÑаÑ. ÐÑа Ñанее ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑкÑпоÑÑиÑоваÑÑ ÑÑÐ¾Ñ Ñнимок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии pg_export_snapshot (Ñм. ÐодÑаздел 9.27.5). ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ñнимка, коÑоÑÑй и нÑжно пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ SET TRANSACTION SNAPSHOT в каÑеÑÑве иденÑиÑикаÑоÑа импоÑÑиÑÑемого Ñнимка. Рданной команде ÑÑÐ¾Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ запиÑÑваÑÑÑÑ Ð² виде ÑÑÑоковой конÑÑанÑÑ, напÑÐ¸Ð¼ÐµÑ '00000003-0000001B-1'. SET TRANSACTION SNAPSHOT можно вÑполниÑÑ ÑолÑко в наÑале ÑÑанзакÑии, до пеÑвого запÑоÑа на вÑбоÑÐºÑ Ð¸Ð»Ð¸ изменение даннÑÑ
(SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH или COPY) в ÑекÑÑей ÑÑанзакÑии. Ðолее Ñого, Ð´Ð»Ñ ÑÑанзакÑии Ñже должен бÑÑÑ ÑÑÑановлен ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии SERIALIZABLE или REPEATABLE READ (в пÑоÑивном ÑлÑÑае Ñнимок бÑÐ´ÐµÑ ÑÑÐ°Ð·Ñ Ð¶Ðµ поÑеÑÑн, Ñак как на ÑÑовне READ COMMITTED Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´ÐµÐ»Ð°ÐµÑÑÑ Ð½Ð¾Ð²Ñй Ñнимок). ÐÑли импоÑÑиÑÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ð½Ð° ÑÑовне изолÑÑии SERIALIZABLE, Ñо ÑÑанзакÑиÑ, ÑкÑпоÑÑиÑÑÑÑÐ°Ñ Ñнимок, Ñакже должна ÑабоÑаÑÑ Ð½Ð° ÑÑом ÑÑовне. ÐÑоме Ñого, ÑÑанзакÑии в Ñежиме ÑÑение/запиÑÑ Ð½Ðµ могÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ Ñнимок из ÑÑанзакÑии в Ñежиме «ÑолÑко ÑÑение».
ÐÑимеÑаниÑ
ÐÑли команде SET TRANSACTION не пÑедÑеÑÑвÑÐµÑ START TRANSACTION или BEGIN, она вÑдаÑÑ Ð¿ÑедÑпÑеждение и болÑÑе ниÑего не делаеÑ.
Ðез SET TRANSACTION можно обойÑиÑÑ, задав ÑÑебÑемÑе ÑежимÑ_ÑÑанзакÑии в опеÑаÑоÑаÑ
BEGIN или START TRANSACTION. Ðо Ð´Ð»Ñ SET TRANSACTION SNAPSHOT Ñакой возможноÑÑи не пÑедÑÑмоÑÑено.
Ð ÐµÐ¶Ð¸Ð¼Ñ ÑÑанзакÑии Ð´Ð»Ñ ÑеанÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже задаÑÑ Ð¸Ð»Ð¸ пÑоÑиÑаÑÑ Ð² конÑигÑÑаÑионнÑÑ
пеÑеменнÑÑ
default_transaction_isolation, default_transaction_read_only и default_transaction_deferrable. (Ðа пÑакÑике, SET SESSION CHARACTERISTICS â ÑÑо пÑоÑÑо более многоÑÐ»Ð¾Ð²Ð½Ð°Ñ Ð°Ð»ÑÑеÑнаÑива Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑиÑ
пеÑеменнÑÑ
командой SET.) ÐÑо знаÑиÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ ÑÑиÑ
пеÑеменнÑÑ
по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð² Ñайле конÑигÑÑаÑии, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER DATABASE и Ñ. д. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº Ðлаве 20.
Ð ÐµÐ¶Ð¸Ð¼Ñ ÑекÑÑей ÑÑанзакÑии можно Ñакже задаÑÑ Ð¸Ð»Ð¸ пÑоÑиÑаÑÑ Ð² конÑигÑÑаÑионнÑÑ
пеÑеменнÑÑ
default_transaction_isolation, transaction_read_only и transaction_deferrable. ÐÑиÑвоение знаÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· ÑÑиÑ
паÑамеÑÑов ÑавнознаÑна иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SET TRANSACTION Ñ Ñеми же огÑаниÑениÑми по пÑименениÑ. Ðднако ÑÑи паÑамеÑÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð² конÑигÑÑаÑионном Ñайле или каким-Ñо еÑÑ Ð¾Ð±Ñазом, кÑоме как непоÑÑедÑÑвенно в SQL.
ÐÑимеÑÑ
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑанзакÑÐ¸Ñ Ñо Ñнимком даннÑÑ , коÑоÑÑй полÑÑила Ñже ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑÑанзакÑиÑ, его нÑжно ÑнаÑала ÑкÑпоÑÑиÑоваÑÑ Ð¸Ð· пеÑвой ÑÑанзакÑии. ÐÑи ÑÑом бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен иденÑиÑикаÑÐ¾Ñ Ñнимка, напÑимеÑ:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000003-0000001B-1 (1 row)
ÐаÑем ÑÑÐ¾Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð½Ñжно пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ SET TRANSACTION SNAPSHOT в наÑале новой ÑÑанзакÑии:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT '00000003-0000001B-1';
СовмеÑÑимоÑÑÑ
ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑÑандаÑÑе SQL, за иÑклÑÑением Ñежима ÑÑанзакÑии DEFERRABLE и ÑоÑÐ¼Ñ SET TRANSACTION SNAPSHOT, коÑоÑÑе ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми PostgreSQL.
Ð ÑÑандаÑÑе ÑÑовнем изолÑÑии по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑеÑÑÑ SERIALIZABLE. Ð PostgreSQL ÑÑовнем по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð±ÑÑно ÑÑиÑаеÑÑÑ READ COMMITTED, но его можно измениÑÑ, как опиÑано вÑÑе.
Ð ÑÑандаÑÑе SQL еÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð° Ñ Ð°ÑакÑеÑиÑÑика ÑÑанзакÑии, коÑоÑÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ ÑÑими командами: ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑÑиÑеÑкой облаÑÑи. ÐÑа ÑпеÑиÑиÑеÑÐºÐ°Ñ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð²ÑÑÑаиваемого SQL, поÑÑÐ¾Ð¼Ñ Ð² ÑеÑвеÑе PostgreSQL она не Ñеализована.
СÑандаÑÑ SQL ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑледоваÑелÑнÑе ÑежимÑ_ÑÑанзакÑий ÑазделÑлиÑÑ Ð·Ð°Ð¿ÑÑÑми, но по иÑÑоÑиÑеÑким пÑиÑинам PostgreSQL позволÑÐµÑ Ð¾Ð¿ÑÑÑиÑÑ Ð·Ð°Ð¿ÑÑÑе.