MVCC -4ред рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ

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

рдЖрдЬ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

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


рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрди-рджреЗрди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ (рдпрд╛ рдХреЛрдИ рднреА) рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдбреЗрдЯрд╛ рдХреЗ ACID- рд╕рдВрдЧрдд рдЪрд┐рддреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред

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

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



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



рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛


рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдо


рдмреЗрд╢рдХ, рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рднреМрддрд┐рдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрдИ рд╕рдВрдЦреНрдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

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

рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рдЯреАрдХ рдирд┐рдпрдо рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдФрд░ рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ src / backend / utils / time / tqual.c (рд╕рдВрд╕реНрдХрд░рдг 12 рдореЗрдВ, рдЪреЗрдХ src / backend / access / heap / heapam_visibility.c рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛) рдХреЛ рджреЗрдЦрдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ xmin рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ xmax рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛) рдЕрднреА рднреА рд▓рд╛рдЗрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред

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

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд▓реЗрди-рджреЗрди рдХреЛ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓реЗрдХрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдордп рддрдХ):



рдпрд╣рд╛рдВ:

  • рд▓реЗрдирджреЗрди 2 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛,
  • рд▓реЗрди-рджреЗрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди 1 рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рд╕рдордп рд╕рдХреНрд░рд┐рдп рдерд╛ рдЬрдм рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛,
  • рд▓реЗрди-рджреЗрди 3 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реБрдЖ (рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдпрд╛ рдирд╣реАрдВ) рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рдХрд╛ рдХреНрд╖рдг рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдХреЗрд╡рд▓ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдХреНрд╖рдг рдЬреНрдЮрд╛рдд рд╣реИ (рдпрд╣ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдПрдХ рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рддрдереНрдп рдХрд╣реАрдВ рднреА рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рд╕рднреА рд▓реЗрди-рджреЗрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА ProcArray рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдХреНрд░рд┐рдп рд╕рддреНрд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рд▓реЗрдирджреЗрди рдХреА рд╕реВрдЪреА рд╣реИред

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

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

  • рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдХреНрд╖рдг, рдЕрд░реНрдерд╛рддреН, рдЕрдЧрд▓реЗ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ ( рд╕реНрдиреИрдкрд╢реЙрдЯ ред xmax );
  • рд╕реНрдиреИрдкрд╢реЙрдЯ ( Snapshot.xip ) рдХреЗ рд╕рдордп рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдХреА рдПрдХ рд╕реВрдЪреАред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЪрд┐рддреНрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред



рдЙрджрд╛рд╣рд░рдг


рд╕реНрдиреИрдкрд╢реЙрдЯ рджреНрд╡рд╛рд░рд╛ рджреГрд╢реНрдпрддрд╛ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рддреАрди рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА:

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

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

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ PostgreSQL рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИред

рд╕рдм рдХреБрдЫ рддрд╕реНрд╡реАрд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:

 || => SELECT txid_current_snapshot(); 
 || txid_current_snapshot || ----------------------- || 3695:3697:3695 || (1 row) 

рдпрд╣рд╛рдБ, рдХреЙрд▓рди рд╕реНрдиреИрдкрд╢реЙрдЯ.xmin, Snapshot.xmax рдФрд░ Snapshot.xip рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕рдВрдЦреНрдпрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╕реВрдЪреА)ред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЫрд╡рд┐ рдХреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ.xip рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕реНрдиреИрдкрд╢реЙрдЯ.xmin <= xid <Snapshot.xmax рдХреЗ рд╕рд╛рде рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдПрдХ рдирдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ):

 => 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 рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрдВрдХреНрддрд┐ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рд╕реНрдерд╛рди рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рджреЛ рдЕрд▓рдЧ рдирд╣реАрдВред рдРрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд▓реЗрди-рджреЗрди рдореЗрдВ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рджреБрд░реНрд▓рдн рд╣реИред

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

рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгред рд╣рдо рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд╛рдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 => BEGIN; => SELECT txid_current(); 
  txid_current -------------- 3698 (1 row) 
 INSERT INTO accounts(id, number, client, amount) VALUES (4, 3001, 'charlie', 100.00); 

рд╣рдо рдХреЙрдЗрди рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП - рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ):

 => 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 рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ


рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди (рд╕реНрдиреИрдкрд╢реЙрдЯред рдПрдХреНрд╕рдорд┐рди) рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд░реНрде рд╣реИ - рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ "рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЕрдкрдиреЗ рдХреНрд╖рд┐рддрд┐рдЬ рд╕реЗ рдкрд░реЗ, рдПрдХ рд▓реЗрди-рджреЗрди рд╣рдореЗрд╢рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред

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



рд▓реЗрдирджреЗрди рдХреА "рдШрдЯрдирд╛ рдХреНрд╖рд┐рддрд┐рдЬ" рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 => BEGIN; => SELECT backend_xmin FROM pg_stat_activity WHERE pid = pg_backend_pid(); 
  backend_xmin -------------- 3699 (1 row) 

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

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

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

рдпрджрд┐ рдЕрдм, рд▓реЗрди-рджреЗрди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕реНрдиреИрдкрд╢реЙрдЯ (рд╕реНрдиреИрдкрд╢реЙрдЯред xmin рд╕реЗ рд╕реНрдиреИрдкрд╢реЙрдЯред xmax рддрдХ) рдХреЛ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:



рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рдмреЙрдЯрд▓рдореЙрд╕реНрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯ рдПрдХ рдЕрдкреВрд░реНрдг рд▓реЗрдирджреЗрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢реЗрд╖ рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВред 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) 

рдпрджрд┐ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ, рд╕рдВрд╕реНрдХрд░рдг 9.6 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рджреЛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

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

рдбреЗрдЯрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ


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

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

Pg_export_snapshot рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП (рдмрд╛рд╣рд░реА рд╕рд╛рдзрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ DBMS) рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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


All Articles