рдПрдорд╡реАрд╕реАрд╕реА-3. рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЗрдиреНрд╕реБрд▓реЗрд╢рди, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд╛рдкрд╕реА рдХреА рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛. рдФрд░ рдЕрдВрддрддрдГ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЗ рддрдХ рдкрд╣реБрдБрдЪ рдЧрдП - рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдгред

рд╢реАрд░реНрд╖рдХ

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЛ рдЪрд┐рд╣реНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ "рд╕рдордп" рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (xmin рдФрд░ xmax)ред рдЙрджреНрдзрд░рдгреЛрдВ рдореЗрдВ - рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрдврд╝рддреЗ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХрд╛рдЙрдВрдЯрд░ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдирдВрдмрд░ рд╣реИред

(рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ: рдХрд╛рдЙрдВрдЯрд░ рдХреА рд╕реАрдорд┐рдд рдмрд┐рдЯ рдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рд╣рд░ рд╕рдордп рдирд╣реАрдВ рдмрдврд╝ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд░реБрдХреЗрдВрдЧреЗ рддреЛ рд╣рдо рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред)

рдЬрдм рдПрдХ рдкрдВрдХреНрддрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ xmin рдХреЛ рдЙрд╕ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ INSERT рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдерд╛, рдФрд░ xmax рдХреЛ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬрдм рдХреЛрдИ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ xmax рдорд╛рди DELETE рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдСрдкрд░реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рд╣рдЯрд╛рдПрдВ рдФрд░ рдбрд╛рд▓реЗрдВред рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг xmax рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЙрд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕рдХрд╛ xmin рдорд╛рди рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmax рдорд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ xmin рдФрд░ xmax рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрди рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣реЗрдбрд░ рдореЗрдВ рдЕрдиреНрдп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдЗрдиреНрдлреЛрдорд╛рд╕реНрдХ рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ; рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдореБрдЦреНрдп рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
  • ctid рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдЧрд▓реЗ, рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИред рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рдХреЗ рдирд╡реАрдирддрдо, рд╕рдмрд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, ctid рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣реА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд░реВрдк (x,y) рд╣реИ, рдЬрд╣рд╛рдВ x рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рд╣реИ, y рд╕рд░рдгреА рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
  • рд╢реВрдиреНрдп рдмрд┐рдЯрдореИрдк - рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЙрди рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди (NULL) рд╣реЛрддрд╛ рд╣реИред NULL рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣реЗрдбрд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ - рд▓рд╛рдЗрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо 23 рдмрд╛рдЗрдЯреНрд╕, рдФрд░ рдЖрдорддреМрд░ рдкрд░ NULL рдмрд┐рдЯрдореИрдк рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХред рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ "рд╕рдВрдХреАрд░реНрдг" рд╣реИ (рдЕрд░реНрдерд╛рдд рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХреЙрд▓рдо рд╣реИрдВ), рддреЛ рдУрд╡рд░рд╣реЗрдб рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред

рд╕рдореНрдорд┐рд▓рд┐рдд

рдЖрдЗрдП рдЗрд╕ рдмрд╛рдд рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ рд╕рдореНрдорд┐рд▓рди рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреИрд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЛ рдХреЙрд▓рдо рд╡рд╛рд▓реА рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВ:

=> CREATE TABLE t(
  id serial,
  s text
);
=> CREATE INDEX ON t(s);

рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВред

=> BEGIN;
=> INSERT INTO t(s) VALUES ('FOO');

рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдирдВрдмрд░ рд╣реИ:

=> SELECT txid_current();
 txid_current 
--------------
         3664
(1 row)

рдЖрдЗрдП рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирдЬрд░ рдбрд╛рд▓реЗрдВред рдкреЗрдЬрдЗрдВрд╕реНрдкреЗрдХреНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ heap_page_items рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

=> SELECT * FROM heap_page_items(get_raw_page('t',0)) gx
-[ RECORD 1 ]-------------------
lp          | 1
lp_off      | 8160
lp_flags    | 1
lp_len      | 32
t_xmin      | 3664
t_xmax      | 0
t_field3    | 0
t_ctid      | (0,1)
t_infomask2 | 2
t_infomask  | 2050
t_hoff      | 24
t_bits      | 
t_oid       | 
t_data      | x0100000009464f4f

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ PostgreSQL рдореЗрдВ рд╣реАрдк рд╢рдмреНрдж рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдПрдХ рдФрд░ рдЕрдЬреАрдм рдкреНрд░рдпреЛрдЧ рд╣реИ - рдвреЗрд░ рдорд╛рд▓реВрдо рд╣реЛрддрд╛ рд╣реИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛, рдЬрд┐рд╕рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЖрджреЗрд╢рд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд "рд╕рдмрдХреБрдЫ рдПрдХ рд╕рд╛рде рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рдХреЗ рдЕрд░реНрде рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рдРрд╕реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рднрд╛рдЧ рдЫреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЙрд╕реЗ рд╕рдордЭреЗрдВрдЧреЗ:

=> SELECT '(0,'||lp||')' AS ctid,
       CASE lp_flags
         WHEN 0 THEN 'unused'
         WHEN 1 THEN 'normal'
         WHEN 2 THEN 'redirect to '||lp_off
         WHEN 3 THEN 'dead'
       END AS state,
       t_xmin as xmin,
       t_xmax as xmax,
       (t_infomask & 256) > 0  AS xmin_commited,
       (t_infomask & 512) > 0  AS xmin_aborted,
       (t_infomask & 1024) > 0 AS xmax_commited,
       (t_infomask & 2048) > 0 AS xmax_aborted,
       t_ctid
FROM heap_page_items(get_raw_page('t',0)) gx
-[ RECORD 1 ]-+-------
ctid          | (0,1)
state         | normal
xmin          | 3664
xmax          | 0
xmin_commited | f
xmin_aborted  | f
xmax_commited | f
xmax_aborted  | t
t_ctid        | (0,1)

рдпрд╣рд╛рдБ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:

  • рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ t_ctid рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рд╢реВрдиреНрдп рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛: (рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛, рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛)ред
  • Lp_flags рд╕реВрдЪрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭрд╛ред рдпрд╣рд╛рдВ рдпрд╣ "рд╕рд╛рдорд╛рдиреНрдп" рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реВрдЪрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рдЕрд░реНрде рджреЗрдЦреЗрдВрдЧреЗред
  • рд╕рднреА рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕реЗ, рдЕрдм рддрдХ рдХреЗрд╡рд▓ рджреЛ рдЬреЛрдбрд╝реЗ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЧрдИ рд╣реИред xmin_committed рдФрд░ xmin_aborted рдмрд┐рдЯреНрд╕ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ xmin рдкреНрд░рддрд┐рдмрджреНрдз (рдирд┐рд░рд╕реНрдд) рд╣реИ рдпрд╛ рдирд╣реАрдВред рджреЛ рд╕рдорд╛рди рдмрд┐рдЯ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ xmax рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рдЬрдм рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ 1 рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬреЛ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рдПрдХрдорд╛рддреНрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧреАред

рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, xmin рдлрд╝реАрд▓реНрдб рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИред рд▓реЗрди-рджреЗрди рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП xmin_committed рдФрд░ xmin_aborted рджреЛрдиреЛрдВ рдмрд┐рдЯ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВред

рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг ctid рдлрд╝реАрд▓реНрдб рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ.

рдПрдХреНрд╕рдореИрдХреНрд╕ рдлрд╝реАрд▓реНрдб рдПрдХ рдбрдореА рдирдВрдмрд░ 0 рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрдВрдХреНрддрд┐ рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╣реИред рд▓реЗрди-рджреЗрди рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ xmax_aborted рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИред

рдЖрдЗрдП рд▓реЗрди-рджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рдЬреЛрдбрд╝рдХрд░ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдФрд░ рдХрджрдо рдЙрдард╛рдПрдВред рдФрд░ рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

=> CREATE FUNCTION heap_page(relname text, pageno integer)
RETURNS TABLE(ctid tid, state text, xmin text, xmax text, t_ctid tid)
AS $$
SELECT (pageno,lp)::text::tid AS ctid,
       CASE lp_flags
         WHEN 0 THEN 'unused'
         WHEN 1 THEN 'normal'
         WHEN 2 THEN 'redirect to '||lp_off
         WHEN 3 THEN 'dead'
       END AS state,
       t_xmin || CASE
         WHEN (t_infomask & 256) > 0 THEN ' (c)'
         WHEN (t_infomask & 512) > 0 THEN ' (a)'
         ELSE ''
       END AS xmin,
       t_xmax || CASE
         WHEN (t_infomask & 1024) > 0 THEN ' (c)'
         WHEN (t_infomask & 2048) > 0 THEN ' (a)'
         ELSE ''
       END AS xmax,
       t_ctid
FROM heap_page_items(get_raw_page(relname,pageno))
ORDER BY lp;
$$ LANGUAGE SQL;

рдЗрд╕ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3664 | 0 (a) | (0,1)
(1 row)

рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдХрдо рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА, рдЫрджреНрдо рдХреЙрд▓рдо xmin рдФрд░ xmax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3664 |    0 |  1 | FOO
(1 row)

рдирд┐рд░реНрдзрд╛рд░рдг

рдпрджрд┐ рдХреЛрдИ рд▓реЗрди-рджреЗрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдпрд╛рдж рд░рдЦрдиреА рд╣реЛрдЧреА - рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, XACT рдирд╛рдордХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 10 рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ CLOG (рдХрдорд┐рдЯ рд▓реЙрдЧ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдирд╛рдо рдЕрднреА рднреА рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

XACT рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИ; рдпреЗ PGDATA/pg_xact рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рджреЛ рдмрд┐рдЯреНрд╕ рд╣реИрдВ: рдкреНрд░рддрд┐рдмрджреНрдз рдФрд░ рдирд┐рд░рд╕реНрдд - рдмрд┐рд▓реНрдХреБрд▓ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд╣реЗрдбрд░ рдХреА рддрд░рд╣ред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ; рдЬрдм рд╣рдо рдлрд╝реНрд░реАрдЬрд╝рд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рддреЛ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВрдЧреЗред рдФрд░ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣, рдкреЗрдЬ рджрд░ рдкреЗрдЬ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЬрдм XACT рдореЗрдВ рдХреЛрдИ рд▓реЗрдирджреЗрди рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдмрд┐рдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХрдорд┐рдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдпрд╣реА рд╕рдм рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдо рдЕрднреА рдкреНрд░реА-рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд▓реЙрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред

рдЬрдм рдХреЛрдИ рдЕрдиреНрдп рд▓реЗрдирджреЗрди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рджреЗрдЦреЗ рдЧрдП рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╣реЛрдВрдЧреЗред

  1. рдХреНрдпрд╛ xmin рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
    рдпрд╣ рдЬрд╛рдБрдЪ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрдХрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ ProcArray рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рднреА рд╕рдХреНрд░рд┐рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди (рд╕рдХреНрд░рд┐рдп) рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред
  2. рдЕрдЧрд░ рдкреВрд░рд╛ рд╣реБрдЖ рддреЛ рдХреИрд╕реЗ - рдХрдорд┐рдЯ рдХрд░рдХреЗ рдпрд╛ рд░рджреНрдж рдХрд░рдХреЗ? рдпрджрд┐ рд░рджреНрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
    XACT рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╕реА рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди, рд╣рд╛рд▓рд╛рдБрдХрд┐ XACT рдХреЗ рдЕрдВрддрд┐рдо рдкреГрд╖реНрда RAM рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдлрд┐рд░ рднреА рд╣рд░ рдмрд╛рд░ XACT рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmin_committed рдФрд░ xmin_aborted рдмрд┐рдЯреНрд╕ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрд┐рдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди xmin рдХреА рд╕реНрдерд┐рддрд┐ рдЬреНрдЮрд╛рдд рдорд╛рдиреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ XACT рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЗрди рдмрд┐рдЯреНрд╕ рдХреЛ рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдХреЗ рд╕реЗрдЯ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЬрдм рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд▓реЗрди-рджреЗрди рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдлрд▓ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рдХреЗ рд╕рдордп, рдпрд╣ рдЕрдм рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреМрди рд╕реЗ рдкреГрд╖реНрда рдмрджрд▓реЗ рдЧрдП рдереЗред рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рдкрдиреНрдиреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рд▓рд╛рднрд╣реАрди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдмрдлрд╝рд░ рдХреИрд╢ рд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдмрд┐рдЯреНрд╕ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХрд╛рдлреА рдзреАрдореА рд╣реЛ рдЬрд╛рдПрдЧреАред

рдмрдЪрдд рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдХреЛрдИ рднреА рд▓реЗрдирджреЗрди (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реАрдб - рд╕реЗрд▓реЗрдХреНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рднреА) рдмрдлрд░ рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдкреЗрдЬ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреЛ, рдЖрдЗрдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдареАрдХ рдХрд░реЗрдВред

=> COMMIT;

рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ (рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ XACT рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд░реНрдЬ рд╣реИ):

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3664 | 0 (a) | (0,1)
(1 row)

рдЕрдм рдЬреЛ рд▓реЗрди-рджреЗрди рдкрд╣рд▓реЗ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдЙрд╕реЗ xmin рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ рдЗрд╕реЗ рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3664 (c) | 0 (a) | (0,1)
(1 row)

рдирд┐рд╖реНрдХрд╛рд╕рди

рдЬрдм рдХреЛрдИ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmax рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдФрд░ xmax_aborted рдмрд┐рдЯ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдХреЗ рдЕрдиреБрд░реВрдк xmax рдХрд╛ рд╕реЗрдЯ рдорд╛рди рдкрдВрдХреНрддрд┐ рд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рд▓реЗрди-рджреЗрди рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдпрд╛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд▓реЗрди-рджреЗрди xmax рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдмрд╛рдж рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрдВрдХреНрддрд┐ рддрд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд╕реАрдорд┐рдд рд╣реИред рд╡реЗ рд░реИрдо рдореЗрдВ рдЬрдЧрд╣ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, "рд▓рдВрдмреЗ" рд▓реЗрдирджреЗрди рдХреЗ рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреА рдЬрд╛рдПрдЧреАред

рдЪрд▓рд┐рдП рд▓рд╛рдЗрди рд╣рдЯрд╛рддреЗ рд╣реИрдВ.

=> BEGIN;
=> DELETE FROM t;
=> SELECT txid_current();
 txid_current 
--------------
         3665
(1 row)

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрди-рджреЗрди рд╕рдВрдЦреНрдпрд╛ xmax рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ:

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax | t_ctid 
-------+--------+----------+------+--------
 (0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)

рд░рджреНрдж

рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рд░рд╕реНрдд рдХрд░рдирд╛ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ XACT рдореЗрдВ рдирд┐рд░рд╕реНрдд рдмрд┐рдЯ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреВрд░реНрд╡рд╡рдд рдХрд░рдирд╛ рдХрдорд┐рдЯ рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рд╣реА рддреЗрдЬрд╝ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХрдорд╛рдВрдб рдХреЛ рд░реЛрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдбреЗрдЯрд╛ рдкреЗрдЬреЛрдВ рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬрд╝ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИред

=> ROLLBACK;
=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax | t_ctid 
-------+--------+----------+------+--------
 (0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)

рдЬрдм рдкреЗрдЬ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ xmax_aborted рд╕рдВрдХреЗрдд рдмрд┐рдЯ рдХреЛ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХреНрд╕рдореИрдХреНрд╕ рдирдВрдмрд░ рдкреЗрдЬ рдкрд░ рд╣реА рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЙрд╕ рдкрд░ рдирдЬрд░ рдирд╣реАрдВ рдбрд╛рд▓реЗрдЧрд╛ред

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   |   xmax   | t_ctid 
-------+--------+----------+----------+--------
 (0,1) | normal | 3664 (c) | 3665 (a) | (0,1)
(1 row)

рдЕрджреНрдпрддрди

рдЕрджреНрдпрддрди рдРрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдорд╛рдиреЛ рдЙрд╕рдиреЗ рдкрд╣рд▓реЗ рдкрдВрдХреНрддрд┐ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реЛ рдФрд░ рдлрд┐рд░ рдПрдХ рдирдпрд╛ рдбрд╛рд▓рд╛ рд╣реЛред

=> BEGIN;
=> UPDATE t SET s = 'BAR';
=> SELECT txid_current();
 txid_current 
--------------
         3666
(1 row)

рдХреНрд╡реЗрд░реА рдПрдХ рдкрдВрдХреНрддрд┐ (рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг) рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ:

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | BAR
(1 row)

рд▓реЗрдХрд┐рди рдкреГрд╖реНрда рдкрд░ рд╣рдо рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ:

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3664 (c) | 3666  | (0,2)
 (0,2) | normal | 3666     | 0 (a) | (0,2)
(2 rows)

рд╣рдЯрд╛рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ xmax рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдорд╛рди рдкреБрд░рд╛рдиреЗ рдХреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдирджреЗрди рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ xmax_aborted рдмрд┐рдЯ рд╕рд╛рдлрд╝ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред

рдкрдВрдХреНрддрд┐ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдм рджреВрд╕рд░реЗ (t_ctid рдлрд╝реАрд▓реНрдб) рдХреЛ рдирдП рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдХ рджреВрд╕рд░рд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрда рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рдореЗрдВ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреА рд╣реИред

рд╣рдЯрд╛рдиреЗ рдХреА рддрд░рд╣ рд╣реА, рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ xmax рдорд╛рди рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рд▓реЙрдХ рд╣реИред

рдЦреИрд░, рдЪрд▓реЛ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдХрд░реЗрдВред

=> COMMIT;

рд╕реВрдЪрдХрд╛рдВрдХ

рдЕрднреА рддрдХ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЯреЗрдмрд▓ рдкреЗрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИред рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рднреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреА-рдЯреНрд░реА рдореЗрдВ рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреЗрдЬ рдФрд░ "рдирд┐рдпрдорд┐рдд" рдкреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреГрд╖реНрда рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрддреА рд╣реИ (рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рдХреА рддрд░рд╣)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреГрд╖реНрда рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реЛрддреА рд╣реИред

рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рднреА рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреА-рдЯреНрд░реА рдХреЗ рд▓рд┐рдП, рд▓реАрдл рдкреЗрдЬреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдХреБрдВрдЬреА рдорд╛рди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн (рд╕реАрдЯреАрдЖрдИрдбреА) рд╣реЛрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╛ рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпреА рдЧрдпреА рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдХреЛрдИ xmin рдФрд░ xmax рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рд▓рд┐рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдХрд░ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдирджреЗрди рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред (рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ рдкреВрд░рд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред)

рдЙрд╕реА рд╕рдордп, рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рдореЗрдВ рд╣рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдФрд░ рдкреБрд░рд╛рдиреЗ рджреЛрдиреЛрдВ:

=> SELECT itemoffset, ctid FROM bt_page_items('t_s_idx',1);
 itemoffset | ctid  
------------+-------
          1 | (0,2)
          2 | (0,1)
(2 rows)

рдЖрднрд╛рд╕реА рд▓реЗрдирджреЗрди

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, PostgreSQL рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ "рд╕рд╣реЗрдЬрдиреЗ" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдИ рд▓реЗрдирджреЗрди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ xid рдЬрд╛рд░реА рдХрд░рддреА рд╣реИред рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА рдФрд░ рдПрдХ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рдирдВрдмрд░ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред рдЬрдм рд╣рдо рдлрд╝реНрд░реАрдЬрд╝рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред

рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдирдВрдмрд░реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрди рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрднрд╛рд╕реА рд▓реЗрдирджреЗрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкрд╣рд▓реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдбреЗрдЯрд╛ рдкреЗрдЬреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдкреЗрдЬ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдЗрд╕рдХрд╛ рд╕рд╛рд░рд╛ рдЕрд░реНрде рдЦреЛ рд╕рдХрддрд╛ рд╣реИред

=> BEGIN;
=> SELECT txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                         
(1 row)

рдпрджрд┐ рдХрд┐рд╕реА рд▓реЗрдирджреЗрди рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдЕрджреНрд╡рд┐рддреАрдп рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рджреА рдЬрд╛рддреА рд╣реИред

=> UPDATE accounts SET amount = amount - 1.00;
=> SELECT txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                     3667
(1 row)

=> COMMIT;

рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди

рдЕрдВрдХ рд╕рд╣реЗрдЬреЗрдВ

рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдВрдХ рд╕рд╣реЗрдЬреЗрдВ (рд╕реЗрд╡рдкреЙрдЗрдВрдЯ), рдЬреЛ рдЖрдкрдХреЛ рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЙрд╕рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЖрд░реЗрдЦ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдмреИрдарддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдирджреЗрди рдХреА рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ, рдФрд░ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рдкреЙрдЗрдВрдЯ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди (рдЙрдкрд▓реЗрди-рджреЗрди), рдЬрд┐рд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдХреА рдЕрдкрдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ (рдореБрдЦреНрдп рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ)ред рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ XACT рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореБрдЦреНрдп рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ: рдпрджрд┐ рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рднреА рд░рджреНрдж рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд▓реЗрди-рджреЗрди рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА PGDATA/pg_subtrans рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ XACT рдмрдлрд╝рд░реНрд╕ рдХреА рддрд░рд╣ рд╣реА рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдХреЛ рд╕реНрд╡рд╛рдпрддреНрдд рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред рд╕реНрд╡рд╛рдпрддреНрдд рд▓реЗрдирджреЗрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рдпрдорд┐рдд PostgreSQL рдореЗрдВ рдХреЛрдИ рд╕реНрд╡рд╛рдпрддреНрдд рд▓реЗрдирджреЗрди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░, рд╢рд╛рдпрдж, рд╕рд░реНрд╡реЛрддреНрддрдо рдХреЗ рд▓рд┐рдП: рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд╣реБрдд рд╣реА рдХрдо рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдиреНрдп DBMS рдореЗрдВ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рднрдбрд╝рдХрд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рд░ рдХреЛрдИ рдкреАрдбрд╝рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЖрдЗрдП рддрд╛рд▓рд┐рдХрд╛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ, рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВ:

=> TRUNCATE TABLE t;
=> BEGIN;
=> INSERT INTO t(s) VALUES ('FOO');
=> SELECT txid_current();
 txid_current 
--------------
         3669
(1 row)

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3669 | 0 (a) | (0,1)
(1 row)

рдЕрдм рдПрдХ рд╕реЗрд╡ рдкреЙрдЗрдВрдЯ рд▓рдЧрд╛рдПрдВ рдФрд░ рджреВрд╕рд░реА рд▓рд╛рдЗрди рдбрд╛рд▓реЗрдВред

=> SAVEPOINT sp;
=> INSERT INTO t(s) VALUES ('XYZ');
=> SELECT txid_current();
 txid_current 
--------------
         3669
(1 row)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ txid_current() рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВред

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3670 |    0 |  3 | XYZ
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3669 | 0 (a) | (0,1)
 (0,2) | normal | 3670 | 0 (a) | (0,2)
(2 rows)

рдЖрдЗрдП рд╕реЗрд╡ рдкреЙрдЗрдВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рддреАрд╕рд░реА рд▓рд╛рдЗрди рдбрд╛рд▓реЗрдВред

=> ROLLBACK TO sp;
=> INSERT INTO t(s) VALUES ('BAR');
=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3671 |    0 |  4 | BAR
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669     | 0 (a) | (0,1)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671     | 0 (a) | (0,3)
(3 rows)

рдкреГрд╖реНрда рдореЗрдВ рд╣рдо рд░рджреНрдж рдХрд┐рдП рдЧрдП рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реА рдЧрдИ рдкрдВрдХреНрддрд┐ рдХреЛ рджреЗрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ.

=> COMMIT;
=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3671 |    0 |  4 | BAR
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669 (c) | 0 (a) | (0,1)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671 (c) | 0 (a) | (0,3)
(3 rows)

рдЕрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдХреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрди-рджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ SQL рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рд╡рд░реНрддрдорд╛рди рд▓реЗрди-рджреЗрди рдХреЛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдирдпрд╛ рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕реЗрд╡рдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рд╛рде рд╣реА рдкреАрдПрд▓/рдкреАрдЬреАрдПрд╕рдХреНрдпреВрдПрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╕рдордп рдФрд░ рдХрдИ рдЕрдиреНрдп, рдЕрдзрд┐рдХ рд╡рд┐рджреЗрд╢реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рддрдВрддреНрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИред

=> BEGIN;
BEGIN
=> BEGIN;
WARNING:  there is already a transaction in progress
BEGIN
=> COMMIT;
COMMIT
=> COMMIT;
WARNING:  there is no transaction in progress
COMMIT

рд╕рдВрдЪрд╛рд▓рди рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдФрд░ рдкрд░рдорд╛рдгреБрддрд╛

рдпрджрд┐ рдХреЛрдИ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

=> BEGIN;
=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> UPDATE t SET s = repeat('X', 1/(id-4));
ERROR:  division by zero

рдПрдХ рдЧрд▓рддреА рд╣реБрдИ рд╣реИред рдЕрдм рд▓реЗрди-рджреЗрди рдирд┐рд░рд╕реНрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ:

=> SELECT * FROM t;
ERROR:  current transaction is aborted, commands ignored until end of transaction block

рдФрд░ рдпрджрд┐ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА PostgreSQL рдирд┐рд░рд╕реНрдд рд╣реЛрдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛:

=> COMMIT;
ROLLBACK

рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рд▓реЗрди-рджреЗрди рдЬрд╛рд░реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддрд╛? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрдВрдЧреЗ - рд▓реЗрдирджреЗрди рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдСрдкрд░реЗрдЯрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669 (c) | 3672  | (0,4)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671 (c) | 0 (a) | (0,3)
 (0,4) | normal | 3672     | 0 (a) | (0,4)
(4 rows)

рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ psql рдореЗрдВ рдПрдХ рдореЛрдб рд╣реИ рдЬреЛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рднреА рд▓реЗрдирджреЗрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЧрд▓рдд рдСрдкрд░реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

=> set ON_ERROR_ROLLBACK on
=> BEGIN;
=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> UPDATE t SET s = repeat('X', 1/(id-4));
ERROR:  division by zero

=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> COMMIT;

рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдореЛрдб рдореЗрдВ, psql рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрд╡ рдкреЙрдЗрдВрдЯ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рд░реЛрд▓рдмреИрдХ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд┐рдП рдмрд┐рдирд╛) рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред

рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ