PostgreSQL-4 рдореЗрдВ MVCCред рд╕реНрдиреИрдкрд╢реЙрдЯреНрд╕

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

рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЯреНрдпреВрдкрд▓реНрд╕ рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреНрдпрд╛ рд╣реИ?


рдбреЗрдЯрд╛ рдкреЗрдЬ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрди-рджреЗрди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ (рдпрд╛ рдХреЛрдИ рднреА) рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╕рднреА рдЙрд╕ рд╕рдордп рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ (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; -- any query 
  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; 

рдкрд░ рдкрдврд╝реЗрдВ ред

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


All Articles