рдЕрд▓рдЧрд╛рд╡ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдФрд░
рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ
рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЦреЛрдЬ рдХреА рдФрд░ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдиреЗ рдЯрдкрд▓ рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред
рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЯреНрдпреВрдкрд▓реНрд╕ рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреНрдпрд╛ рд╣реИ?
рдбреЗрдЯрд╛ рдкреЗрдЬ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрди-рджреЗрди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ (рдпрд╛ рдХреЛрдИ рднреА) рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╕рднреА рдЙрд╕ рд╕рдордп рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ (ACID рдХреЗ рдЕрд░реНрде рдореЗрдВ) рдХреА рдПрдХ рд╕реБрд╕рдВрдЧрдд рддрд╕реНрд╡реАрд░ рдмрдирд╛ рд╕рдХреЗрдВред
PosgreSQL рдореЗрдВ рдЕрд▓рдЧрд╛рд╡ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдирджреЗрди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ "рдбреЗрдЯрд╛" рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ "рдбреЗрдЯрд╛" рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдХреНрд╖рдг рддрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рдереЗред рд╣рдо рдкрд╣рд▓реЗ
рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдЕрд▓рдЧрд╛рд╡ рдорд╛рдирдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕рдЦреНрдд рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдБ рд╣реИрдВред
рдкреНрд░рддрд┐рдмрджреНрдз рдЕрд▓рдЧрд╛рд╡ рдкрдврд╝реЗрдВ рд╕реНрддрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдирджреЗрди рд╡рд┐рд╡рд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕рдХреНрд░рд┐рдп рд╣реИ рдЬрдмрдХрд┐ рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдирджреЗрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ tuples рдХреА рджреГрд╢реНрдпрддрд╛
рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдо
рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ tuples рдХреА рдПрдХ рднреМрддрд┐рдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдИ рдирдВрдмрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВ, рд╕реНрдиреИрдкрд╢реЙрдЯ рд╣реЗрдбрд░ рдореЗрдВ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН,
xmin
рдФрд░
xmax
, рдЕрд░реНрдерд╛рддреН, рдЙрд╕ рд▓реЗрдирджреЗрди рдХреА рдЖрдИрдбреА рдЬреЛ рдЯреНрдпреВрдкрд▓ рдХреЛ
xmin
рдФрд░
xmax
ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдЯреАрдХ рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдо рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдФрд░ рдЪрд░рдо рд╕реАрдорд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ src / backend / utils / time / tqual.c (рд╕рдВрд╕реНрдХрд░рдг 12 рдореЗрдВ, рдЪреЗрдХ src / backend / access / heap / heapam_visibility.c рдкрд░ рдЪрд▓реЗ рдЧрдП) рдХреЛ рджреЗрдЦрдХрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдЬрдм рдПрдХ
xmin
рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ
xmin
рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐
xmin
рд▓реЗрдирджреЗрди рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЯрдкрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдХрд┐рд╕реА рд▓реЗрди-рджреЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рддреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╣реА рд▓реЗрди-рджреЗрди рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрднреА рддрдХ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ) рдпрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдкреНрд░рддрд┐рдмрджреНрдз рдерд╛ред
рд╣рдо рд╕реЗрдЧрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ (рд╢реБрд░реВ рд╕рдордп рд╕реЗ рд▓реЗрдХрд░ рдХрдо рд╕рдордп рддрдХ) рд▓реЗрдирджреЗрди рдХрд╛ рд░реЗрдЦрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╣рд╛рдВ:
- рд▓реЗрдирджреЗрди 2 рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рддрдм рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬрдм рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ред
- рд▓реЗрди-рджреЗрди 1 рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рддрдм рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рд╕рдордп рд╕рдХреНрд░рд┐рдп рдерд╛ рдЬрдм рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рд▓реЗрди-рджреЗрди 3 рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рддрдм рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реБрдЖ (рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВ)ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рд▓реЗрдирджреЗрди рдХреЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдордп рд╕реЗ рдЕрдирдЬрд╛рди рд╣реИред рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдЬреНрдЮрд╛рдд рд╣реИ (рдЬреЛ рд▓реЗрдирджреЗрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ), рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдШрдЯрдирд╛ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред
рд╣рдо рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓реЗрдирджреЗрди рдХреА
рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА ProcArray рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдХреНрд░рд┐рдп рд╕рддреНрд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рд▓реЗрдирджреЗрди рдХреА рд╕реВрдЪреА рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рдкреЛрд╕реНрдЯ рдлреИрдХреНрдЯрдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдВрдЧреЗ рдХрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓реЗрдирджреЗрди рд╕рдХреНрд░рд┐рдп рдерд╛ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╕рднреА рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреА рд╣реЛрдЧреАред
рдКрдкрд░ рд╕реЗ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ PostgreSQL рдореЗрдВ, рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ,
рднрд▓реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЯреБрдкрд▓реНрд╕ рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВред рдПрдХ рд╕рд╡рд╛рд▓ рдЕрдХреНрд╕рд░ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ PostgreSQL рдореЗрдВ рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯрд┐рд╡ (рдпрд╛ рд▓реМрдХрд┐рдХ; рдпрд╛ рдлреНрд▓реИрд╢рдмреИрдХ рдХреА рдХрдореА рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдУрд░реЗрдХрд▓ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ) рдкреНрд░рд╢реНрди - рдФрд░ рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИред
рдордЬрд╝рд╛рдХрд┐рдпрд╛ рдХрд┐рд╕реНрдо рдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рдереА, рд▓реЗрдХрд┐рди рдлрд┐рд░ DBMS рд╕реЗ рд╣рдЯрд╛ рджреА рдЧрдИред рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛрд╕реЗрдл рдПрдоред рд╣реЗрд▓рд░рд╕реНрдЯреАрди рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдЬрд┐рд╕ рд╕рдордп рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЕрдЧрд▓реЗ рд▓реЗрдирджреЗрди рдХреА рдЖрдИрдбреА, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрднреА рддрдХ рдЕрдиреБрдкрд▓рдмреНрдз (
snapshot.xmax
ред snapshot.xmax
)ред - рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (
snapshot.xip
) рдЗрд╕ рд╕рдордп рд╕рдХреНрд░рд┐рдп (рдкреНрд░рдЧрддрд┐ рдореЗрдВ) рд▓реЗрдирджреЗрди рдХреА рд╕реВрдЪреАред
рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрддреА рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдХреА рдЖрдИрдбреА рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (
snapshot.xmin
ред
snapshot.xmin
)ред рдпрд╣ рдорд╛рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд░реНрде рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рд╕реНрдиреИрдкрд╢реЙрдЯ рднреА рдХреБрдЫ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рд╣реАрди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

рдЙрджрд╛рд╣рд░рдг
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рджреГрд╢реНрдпрддрд╛ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрдЗрдП рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рддреАрди рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА, рдЬрд╣рд╛рдБ:
- рдкрд╣рд▓реЗ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реБрдЖ рдерд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рдкреВрд░рд╛ рд╣реБрдЖред
- рджреВрд╕рд░рд╛ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдФрд░ рдкреВрд░рд╛ рд╣реБрдЖ рдерд╛ред
- рддреАрд╕рд░рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
=> TRUNCATE TABLE accounts;
рдкрд╣рд▓рд╛ рд▓реЗрди-рджреЗрди (рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ):
=> BEGIN; => INSERT INTO accounts VALUES (1, '1001', 'alice', 1000.00); => SELECT txid_current();
=> SELECT txid_current(); txid_current -------------- 3695 (1 row)
рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди (рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реБрдЖ):
| => BEGIN; | => INSERT INTO accounts VALUES (2, '2001', 'bob', 100.00); | => SELECT txid_current();
| txid_current | -------------- | 3696 | (1 row)
| => COMMIT;
рджреВрд╕рд░реЗ рд╕рддреНрд░ рдореЗрдВ рд▓реЗрдирджреЗрди рдореЗрдВ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдирд╛ред
|| => BEGIN ISOLATION LEVEL REPEATABLE READ; || => SELECT xmin, xmax, * FROM accounts;
|| xmin | xmax | id | number | client | amount || ------+------+----+--------+--------+-------- || 3696 | 0 | 2 | 2001 | bob | 100.00 || (1 row)
рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди рдХрд░рдирд╛:
=> COMMIT;
рдФрд░ рддреАрд╕рд░рд╛ рд▓реЗрдирджреЗрди (рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛):
| => BEGIN; | => INSERT INTO accounts VALUES (3, '2002', 'bob', 900.00); | => SELECT txid_current();
| txid_current | -------------- | 3697 | (1 row)
| => COMMIT;
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:
|| => SELECT xmin, xmax, * FROM accounts;
|| xmin | xmax | id | number | client | amount || ------+------+----+--------+--------+-------- || 3696 | 0 | 2 | 2001 | bob | 100.00 || (1 row)
рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ Postgres рдпрд╣ рд╕рдордЭрддрд╛ рд╣реИред
рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:
|| => SELECT txid_current_snapshot();
|| txid_current_snapshot || ----------------------- || 3695:3697:3695 || (1 row)
рдпрд╣рд╛рдБ
snapshot.xmin
,
snapshot.xmax
рдФрд░
snapshot.xip
рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ, рдПрдХ рдХреЛрд▓реЛрди рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд╛рдВрдХрд┐рдд (
snapshot.xip
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдирдВрдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рд╕реВрдЪреА рд╣реИ)ред
рдЙрдкрд░реЛрдХреНрдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ, рд╡реЗ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ IDs
xid
рд╕рд╛рде рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдереЗ рдЬреИрд╕реЗ рдХрд┐
snapshot.xmin <= xid < snapshot.xmax
рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐
snapshot.xip
.
snapshot.xip
рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВред рдЖрдЗрдП рд╕рднреА рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдирдП рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ):
=> SELECT xmin, xmax, * FROM accounts ORDER BY id;
xmin | xmax | id | number | client | amount ------+------+----+--------+--------+--------- 3695 | 0 | 1 | 1001 | alice | 1000.00 3696 | 0 | 2 | 2001 | bob | 100.00 3697 | 0 | 3 | 2002 | bob | 900.00 (3 rows)
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИ: рдпрд╣ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди (
xip
) рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИред
рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ: рдпрд╣ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдереА рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рд░реЗрдВрдЬ рдореЗрдВ рд╣реИред
рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИ: рдпрд╣ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
|| => COMMIT;
рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди
рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреБрдЫ рд╣рдж рддрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдХрд┐рд╕реА рднреА рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдкрд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдЦреЛрд▓реЗ рдЧрдП рдХрд░реНрд╕рд░ рдХреЛ рдмрд╛рдж рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЕрдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯрдкрд▓ рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб (
cmin
рдФрд░
cmax
pseudo-
cmin
рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╣реИ, рдЬреЛ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╕рдореНрдорд┐рд▓рди рдХреЗ рд▓рд┐рдП
cmin
рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░
cmax
- рд╡рд┐рд▓реЛрдкрди рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЯрдкрд▓ рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдерд╛рди рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓реЗрди-рджреЗрди рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдореНрдмреЛ рдХрдорд╛рдВрдб рдЖрдИрдбреА (
combocid
) рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдмреИрдХрдПрдВрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕
combocid
рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ
cmin
рдФрд░
cmax
рдХреЛ рдпрд╛рдж
combocid
ред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рджреЗрд╢реА рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЖрдЗрдП рдПрдХ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
=> BEGIN; => SELECT txid_current();
txid_current -------------- 3698 (1 row)
INSERT INTO accounts(id, number, client, amount) VALUES (4, 3001, 'charlie', 100.00);
рдЖрдЗрдП,
cmin
рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП - рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд░реНрдерд╣реАрди рд╣реИ):
=> SELECT xmin, CASE WHEN xmin = 3698 THEN cmin END cmin, * FROM accounts;
xmin | cmin | id | number | client | amount ------+------+----+--------+---------+--------- 3695 | | 1 | 1001 | alice | 1000.00 3696 | | 2 | 2001 | bob | 100.00 3697 | | 3 | 2002 | bob | 900.00 3698 | 0 | 4 | 3001 | charlie | 100.00 (4 rows)
рдЕрдм рд╣рдо рдПрдХ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реНрд╕рд░ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
=> DECLARE c CURSOR FOR SELECT count(*) FROM accounts;
рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдФрд░ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
=> INSERT INTO accounts(id, number, client, amount) VALUES (5, 3002, 'charlie', 200.00);
рдХреНрд╡реЗрд░реА 4 рд▓реМрдЯрддреА рд╣реИ - рдХрд░реНрд╕рд░ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝реА рдЧрдИ рдкрдВрдХреНрддрд┐ рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ:
=> FETCH c;
count ------- 4 (1 row)
рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЦрд╛рддреЗ рдореЗрдВ рдХреЗрд╡рд▓
cmin < 1
рд╕рд╛рде
cmin < 1
ред
=> SELECT xmin, CASE WHEN xmin = 3698 THEN cmin END cmin, * FROM accounts;
xmin | cmin | id | number | client | amount ------+------+----+--------+---------+--------- 3695 | | 1 | 1001 | alice | 1000.00 3696 | | 2 | 2001 | bob | 100.00 3697 | | 3 | 2002 | bob | 900.00 3698 | 0 | 4 | 3001 | charlie | 100.00 3698 | 1 | 5 | 3002 | charlie | 200.00 (5 rows)
=> ROLLBACK;
рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ
рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди (
snapshot.xmin
) рдХреА рдЖрдИрдбреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд░реНрде рдмрдирд╛рддреА рд╣реИ: рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ "рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ" рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдкрдиреЗ рдХреНрд╖рд┐рддрд┐рдЬ рд╕реЗ рдкрд░реЗ рд▓реЗрди-рджреЗрди рд╣рдореЗрд╢рд╛ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреБрд░рд╛рдиреЗ (рдореГрдд) рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЕрдк-рдЯреВ-рдбреЗрдЯ рдПрдХ рдПрдХ рдЕрднреА рддрдХ рдкреВрд░реНрдг рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрднреА рддрдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рднреА рд▓реЗрди-рджреЗрди "рдХреНрд╖рд┐рддрд┐рдЬ рд╕реЗ рдкрд░реЗ" рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рд▓реЗрдирджреЗрди рдХреНрд╖рд┐рддрд┐рдЬ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
=> BEGIN; => SELECT backend_xmin FROM pg_stat_activity WHERE pid = pg_backend_pid();
backend_xmin -------------- 3699 (1 row)
рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рднреА рд╕рдХреНрд░рд┐рдп рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛
xmin
рдЦреЛрдЬрдиреЗ рдХреА
xmin
рд╣реИред рдФрд░ рдпрд╣ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореГрдд рдЯреНрдпреВрдкрд▓реНрд╕ рдХрднреА рднреА рдХрд┐рд╕реА рднреА рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЛ рд╡реИрдХреНрдпреВрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреНрд╖рд┐рддрд┐рдЬ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рд▓реЗрди-рджреЗрди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╖рд┐рддрд┐рдЬ рднреА рдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╕ рдПрдХ рдЕрдкреВрд░реНрдг рд▓реЗрди-рджреЗрди рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛, рднрд▓реЗ рд╣реА рд▓реЗрди-рджреЗрди рд╕реНрд╡рдпрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ рди рд░рдЦрддрд╛ рд╣реЛред
рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ DB рдореЗрдВ рдореГрдд tuples рдХреЛ рд╡реИрдХреНрдпреВрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ "рд▓реЙрдиреНрдЧ-рдкреНрд▓реЗ" рд▓реЗрди-рджреЗрди рдЕрдиреНрдп рд▓реЗрди-рджреЗрди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╖рд┐рддрд┐рдЬ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдЕрдм рд▓реЗрдирджреЗрди рдХреЗ рдмрдЬрд╛рдп рд╕реНрдиреИрдкрд╢реЙрдЯ (рд╕реНрдиреИрдкрд╢реЙрдЯ.
snapshot.xmin
рд╕реЗ
snapshot.xmin
.
snapshot.xmax
) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдХрдо рд╕реНрдиреИрдкрд╢реЙрдЯ рдПрдХ рдЕрдкреВрд░реНрдг рд▓реЗрдирджреЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯред
snapshot.xmin
рд▓реЗрдирджреЗрди рдЖрдИрдбреА рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЗрдирджреЗрди рдХреЛ рдХрдорд┐рдЯреЗрдб рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд░реАрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рднрд▓реЗ рд╣реА рдЗрд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдХреНрд░рд┐рдп рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ:
| => BEGIN; | => UPDATE accounts SET amount = amount + 1.00; | => COMMIT;
=> SELECT backend_xmin FROM pg_stat_activity WHERE pid = pg_backend_pid();
backend_xmin -------------- 3699 (1 row)
рдФрд░ рдХреЗрд╡рд▓ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд╖рд┐рддрд┐рдЬ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рдЬреЛ рдореГрдд рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЛ рд╡реИрдХреНрдпреВрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ:
=> COMMIT; => SELECT backend_xmin FROM pg_stat_activity WHERE pid = pg_backend_pid();
backend_xmin -------------- 3700 (1 row)
рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ рдФрд░ рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 56 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
old_snapshot_threshold
рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЬреАрд╡рдирдХрд╛рд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рд╡реИрдХреНрдпреВрдо рдбреЗрдб рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛, рдФрд░ рдЕрдЧрд░ "рд▓реЙрдиреНрдЧ-рдкреНрд▓реЗ" рд▓реЗрди-рджреЗрди рдЕрднреА рднреА рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ "рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА" рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАредidle_in_transaction_session_timeout
рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдХреЗ рдЕрдзрд┐рдХрддрдо рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдпрд╛рдд
рдХрднреА-рдХрднреА рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрд╣рд╛рдБ рд╕рдорд╛рди рдбреЗрдЯрд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╡рд░реНрддреА рд▓реЗрдирджреЗрди рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ
pg_dump
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ: рд╕рднреА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рд░рд╛рдЬреНрдп рдореЗрдВ рдмреИрдХрдЕрдк рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдирджреЗрди рдХреЗрд╡рд▓ рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ "рдПрдХ рд╕рд╛рде" рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдЖрдпрд╛рдд рдЙрдкрд▓рдмреНрдз рд╣реИред
pg_export_snapshot
рдлрд╝рдВрдХреНрд╢рди рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди (
pg_export_snapshot
рдмрд╛рд╣рд░ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
=> BEGIN ISOLATION LEVEL REPEATABLE READ; => SELECT count(*) FROM accounts;
count ------- 3 (1 row)
=> SELECT pg_export_snapshot();
pg_export_snapshot --------------------- 00000004-00000E7B-1 (1 row)
рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдЕрдкрдиреА рдкрд╣рд▓реА рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ SET TRANSACTION SNAPSHOT рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкрдврд╝реЗрдВ рдпрд╛ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░ рдХреЛ рднреА рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд░реАрдб рдХрдорд┐рдЯреЗрдб рд╕реНрддрд░ рдкрд░, рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЕрдкрдиреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
| => DELETE FROM accounts; | => BEGIN ISOLATION LEVEL REPEATABLE READ; | => SET TRANSACTION SNAPSHOT '00000004-00000E7B-1';
рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди рдЕрдм рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ (рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп) рджреЗрдЦреЗрдВ:
| => SELECT count(*) FROM accounts;
| count | ------- | 3 | (1 row)
рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдирд┐рд░реНрдпрд╛рдд рд▓реЗрдирджреЗрди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рдорд╛рди рд╣реИред
| => COMMIT; => COMMIT;
рдкрд░ рдкрдврд╝реЗрдВ ред