MVCC -3ред рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг

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

рд╣реИрдбрд░


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

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

рдЬрдм рдПрдХ рд▓рд╛рдЗрди рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ Xmin рдХреЛ INSERT рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдирдВрдмрд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ xmax рдкреЙрдкреБрд▓реЗрдЯреЗрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

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

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

  • infomask - рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХрд╛рдлреА рд╣реИрдВ; рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
  • 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 рдлрд╝реАрд▓реНрдб рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

Xmax рдлрд╝реАрд▓реНрдб рдХреЛ рдбрдореА рдирдВрдмрд░ 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. рдХреНрдпрд╛ рд▓реЗрдирджреЗрди рдПрдХреНрд╕рдорд┐рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрддреНрдкрдиреНрди рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
    рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ ProcArray рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рднреА рд╕рдХреНрд░рд┐рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди (рд╕рдХреНрд░рд┐рдп) рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред
  2. рдпрджрд┐ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреИрд╕реЗ - рдирд┐рд░реНрдзрд╛рд░рдг рдпрд╛ рд░рджреНрдж рдХрд░рдХреЗ? рдпрджрд┐ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
    рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ XACT рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдВрддрд┐рдо XACT рдкреЗрдЬ рд░реИрдо рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ XACT рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ xmin_committed рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmin_aborted рдмрд┐рдЯреНрд╕ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрд┐рдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬреНрдЮрд╛рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рдЕрдм 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 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдбреЗрдЯрд╛ рдкреЗрдЬреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдм рдХреБрдЫ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред

 => 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 рд╕рдВрдХреЗрдд рдмрд┐рдЯ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреЗрдЬ рдореЗрдВ рд╕реНрд╡рдпрдВ xmax рдирдВрдмрд░ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦреЗрдЧрд╛ред

 => 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; 

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


рдЕрдм рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рд╕рд╛рд░рдгреАрдмрджреНрдз рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИред рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

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

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

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

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдХреЛрдИ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред рдареАрдХ рд╣реИ, рдпрд╛ рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдИ рдЧрдИ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдХреЛрдИ 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 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрдЪрдд рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рд░реЛрд▓рдмреИрдХ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореЛрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡ рдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рд░реЛрд▓ рдХрд┐рдП рднреА) рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдПред

Source: https://habr.com/ru/post/hi445820/


All Articles