рдкрд┐рдЫрд▓реА рдмрд╛рд░, рд╣рдордиреЗ
рдСрдмреНрдЬреЗрдХреНрдЯ-рд╕реНрддрд░ рдХреЗ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░рд┐рд╢реНрддреЛрдВ рдкрд░ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЖрдЬ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ PostgreSQL рдореЗрдВ рдкрдВрдХреНрддрд┐ рд▓реЙрдХ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЗрдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрддрд╛рд░реЛрдВ рдФрд░ рдмрд╛рд░реА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рд░реЛ рддрд╛рд▓реЗ
рдпреБрдХреНрддрд┐
рдореБрдЭреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВред
- рд╕рд░реНрд╡рд░ рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рд▓реЙрдХ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рддрд╛рд▓реЛрдВ рдХреА рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА, рдХрдо рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ (рд╡рд┐рд╡рд╛рдж)ред
- рджреВрд╕рд░реА рдУрд░, рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдЙрддрдиреА рд╣реА рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рдкрд░ рддрд╛рд▓реЗ рд▓рдЧреЗ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЙрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЕрдиреНрдп рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЙрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдХреБрдЫ DBMS рдореЗрдВ, рддрд╛рд▓реЛрдВ рдХреЗ рд╕реНрддрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ: рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐ рд╕реНрддрд░ рдХреЗ рддрд╛рд▓реЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рд╕реНрддрд░ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛) рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, PostgreSQL рднреА рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд┐рдзреЗрдп рддрд╛рд▓реЗ рдХреЗ рд▓рд┐рдПред рд▓рд╛рдЗрди рдХреЗ рддрд╛рд▓реЗ рдЕрд▓рдЧ рд╣реИрдВред
PostgreSQL рдореЗрдВ, рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдбреЗрдЯрд╛ рдкреЗрдЬ рдХреЗ рдЕрдВрджрд░
рдкрдВрдХреНрддрд┐ рдХреЗ
рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рд░реИрдо рдореЗрдВ рдирд╣реАрдВ)ред рдпрд╣реА рд╣реИ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрдХреЗрдд рд╣реИред рдпрд╣ рд╕рдВрдХреЗрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ xmax рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рд╣реИ; рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд▓рд╕ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд┐рдП рдЬрд┐рддрдиреА рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдПрдХ
рдорд╛рдЗрдирд╕ рд╣реИ : рдЪреВрдВрдХрд┐ рд░реИрдо рдореЗрдВ рд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд▓рд╛рдЗрди рдореЗрдВ рдирд╣реАрдВ рдЦрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдФрд░ рдХреЛрдИ рдирд┐рдЧрд░рд╛рдиреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ (рддрд╛рд▓реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдареАрдХ рд╣реИ, рдирд┐рдЧрд░рд╛рдиреА рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА "рдирд┐рдпрдорд┐рдд" рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдореЗрдВ рдкрдВрдХреНрддрд┐ рдЬрд╛рд░реА рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрдд рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╕рднреА рддрд╛рд▓реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдпрд╛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЕрд╡рд░реБрджреНрдз рд▓реЗрдирджреЗрди рдХреА рдЕрд╡рд░реБрджреНрдз рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдЕрд╕рд╛рдзрд╛рд░рдг рдореЛрдб рдореЗрдВ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдмрджрд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдПред
рдЕрд╕рд╛рдзрд╛рд░рдг рдореЛрдб
рдХреБрд▓ рдореЗрдВ 4 рдореЛрдб рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд▓рд╛рдЗрди рдХреЛ рд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ, рджреЛ рдореЛрдб
рдЕрдирдиреНрдп рддрд╛рд▓реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдирджреЗрди рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
- рдЕрджреНрдпрддрди рдореЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди (рдпрд╛ рд╡рд┐рд▓реЛрдкрди) рдХрд╛ рдЕрд░реНрде рд╣реИред
- NO KEY UPDATE рдореЛрдб рдХреЗ рд▓рд┐рдП - рдХреЗрд╡рд▓ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдЬреЛ рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рд╕рднреА рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВ)ред
UPDATE рдХрдорд╛рдВрдб рдиреНрдпреВрдирддрдо рдЙрдкрдпреБрдХреНрдд рд▓реЙрдХ рдореЛрдб рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ; рдЖрдорддреМрд░ рдкрд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ NO KEY UPDATE рдореЛрдб рдореЗрдВ рд▓реЙрдХ рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ
рдпрд╛рдж рд╣реИ , рдХрд┐рд╕реА рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рддреЗ рдпрд╛ рдмрджрд▓рддреЗ рд╕рдордп, рд╡рд░реНрддрдорд╛рди рдЯреНрд░рд╛рдВрдЬрд╝реИрдХреНрд╢рди рд╡рд░реНрдЬрди рдирдВрдмрд░ рдХреЛ рдореМрдЬреВрджрд╛ рдХрд░рдВрдЯ рд╡рд░реНрдЬрди рдХреЗ xmax рдлреАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрди-рджреЗрди рд╕реЗ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ, рдЙрд╕реА xmax рдирдВрдмрд░ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ xmax рдПрдХ рд╕рдХреНрд░рд┐рдп (рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ) рд▓реЗрдирджреЗрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рд╕рдорд╛рди рдЦрд╛рддреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБред
=> CREATE TABLE accounts( acc_no integer PRIMARY KEY, amount numeric ); => INSERT INTO accounts VALUES (1, 100.00), (2, 200.00), (3, 300.00);
рдкреГрд╖реНрдареЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рдкреЗрдЬрд┐рдиреНрд╕рдкреЗрдХреНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
=> CREATE EXTENSION pageinspect;
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡рд╣реА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдПрдВ рдЬреЛ рд╣рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: xmax рдФрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдмрд┐рдЯреНрд╕ред
=> CREATE VIEW accounts_v AS SELECT '(0,'||lp||')' AS ctid, t_xmax as xmax, CASE WHEN (t_infomask & 128) > 0 THEN 't' END AS lock_only, CASE WHEN (t_infomask & 4096) > 0 THEN 't' END AS is_multi, CASE WHEN (t_infomask2 & 8192) > 0 THEN 't' END AS keys_upd, CASE WHEN (t_infomask & 16) > 0 THEN 't' END AS keyshr_lock, CASE WHEN (t_infomask & 16+64) = 16+64 THEN 't' END AS shr_lock FROM heap_page_items(get_raw_page('accounts',0)) ORDER BY lp;
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓реЗрди-рджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рдЦрд╛рддреЗ рдХреА рд░рд╛рд╢рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдХреБрдВрдЬреА рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ) рдФрд░ рджреВрд╕рд░реЗ рдЦрд╛рддреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди):
=> BEGIN; => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1; => UPDATE accounts SET acc_no = 20 WHERE acc_no = 2;
рд╣рдо рджреГрд╢реНрдп рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
=> SELECT * FROM accounts_v LIMIT 2;
ctid | xmax | lock_only | is_multi | keys_upd | keyshr_lock | shr_lock -------+--------+-----------+----------+----------+-------------+---------- (0,1) | 530492 | | | | | (0,2) | 530492 | | | t | | (2 rows)
рд▓реЙрдХ рдореЛрдб рдХреА_рд╕реБрдзрд╛рд░рд┐рдд рд╕реВрдЪрдирд╛ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрд╕реА xmax рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд▓реЗрдХреНрдЯ рдлреЙрд░ UPDATE рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд▓реЙрдХ рдХрд░рддреЗ рд╕рдордп рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪрдирд╛ рдмрд┐рдЯ (xmax_lock_only) рдбрд╛рд▓ рджреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рд▓реЙрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
=> ROLLBACK; => BEGIN; => SELECT * FROM accounts WHERE acc_no = 1 FOR NO KEY UPDATE; => SELECT * FROM accounts WHERE acc_no = 2 FOR UPDATE;
=> SELECT * FROM accounts_v LIMIT 2;
ctid | xmax | lock_only | is_multi | keys_upd | keyshr_lock | shr_lock -------+--------+-----------+----------+----------+-------------+---------- (0,1) | 530493 | t | | | | (0,2) | 530493 | t | | t | | (2 rows)
=> ROLLBACK;
рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдореЛрдб
рджреЛ рдФрд░ рдореЛрдб рд╕рд╛рдЭрд╛ рддрд╛рд▓реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдИ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдЬрдм рдЖрдк рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ SHARE рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
- рдХреБрдВрдЬреА рд╕рд╛рдЭрд╛ рдореЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЧреИрд░-рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдбред рдпрд╣ рдореЛрдб, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп PostgreSQL рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВред
=> BEGIN; => SELECT * FROM accounts WHERE acc_no = 1 FOR KEY SHARE; => SELECT * FROM accounts WHERE acc_no = 2 FOR SHARE;
рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
=> SELECT * FROM accounts_v LIMIT 2;
ctid | xmax | lock_only | is_multi | keys_upd | keyshr_lock | shr_lock -------+--------+-----------+----------+----------+-------------+---------- (0,1) | 530494 | t | | | t | (0,2) | 530494 | t | | | t | t (2 rows)
рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, keyshr_lock рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ, рдФрд░ SHARE рдореЛрдб рдХреЛ рдПрдХ рдФрд░ рд╕реВрдЪрдирд╛ рдмрд┐рдЯ рдХреЛ рджреЗрдЦрдХрд░ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рд╕рдВрдЧрддрддрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐:
- рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд╕рд╛рдзрд╛рд░рдг рдореЛрдб рд╕рдВрдШрд░реНрд╖;
- рд╕рд╛рдЭрд╛ рдореЛрдб рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИрдВ;
- рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреБрдВрдЬреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдореЛрдб NO KEY UPDATE рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрдирдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЧреИрд░-рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдВрдЬреА рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ)ред
Multitranzaktsii
рдЕрдм рддрдХ, рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд▓реЙрдХ рдХреЛ xmax рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд╛рд▓реЗ рдХреЛ рдХрдИ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА xmax рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреИрд╕реЗ рд╣реЛ?
рд╕рд╛рдЭрд╛ рддрд╛рд▓реЗ рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд
рдмрд╣реБ -рд▓реЗрдирджреЗрди (рдорд▓реНрдЯреАрдПрдХреНрд╕рдПрдХреНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд▓реЗрдирджреЗрди рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рд╕реМрдВрдкреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдорд╛рди рдЖрдпрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдорд╛рди рд▓реЗрдирджреЗрди рдФрд░ рдмрд╣реБ-рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рд╕реВрдЪрдирд╛ рдмрд┐рдЯ (xmax_is_multi) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рд▓реЙрдХ рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА $ PGDATA / pg_multi / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореМрдЬреВрджрд╛ рддрд╛рд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдПрдХ рдФрд░ рдЕрд╕рд╛рдзрд╛рд░рдг рдПрдХ рдХреЛ рдЬреЛрдбрд╝реЗрдВ (рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдореБрдЦ рд╢реЗрдпрд░ рдФрд░ рдХреЛрдИ рдкреНрд░рдореБрдЦ рдЕрджреНрдпрддрди рдореЛрдб рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИрдВ):
| => BEGIN; | => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
=> SELECT * FROM accounts_v LIMIT 2;
ctid | xmax | lock_only | is_multi | keys_upd | keyshr_lock | shr_lock -------+--------+-----------+----------+----------+-------------+---------- (0,1) | 61 | | t | | | (0,2) | 530494 | t | | | t | t (2 rows)
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рдмрд╣реБрдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ xmax_is_multi рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд▓реНрдЯреАрдЯреНрд░рд╛рдВрд╕рдиреАрдХрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддрд▓реНрд▓реАрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрдВрдХреНрддрд┐ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
=> CREATE EXTENSION pgrowlocks; => SELECT * FROM pgrowlocks('accounts') \gx
-[ RECORD 1 ]----------------------------- locked_row | (0,1) locker | 61 multi | t xids | {530494,530495} modes | {"Key Share","No Key Update"} pids | {5892,5928} -[ RECORD 2 ]----------------------------- locked_row | (0,2) locker | 530494 multi | f xids | {530494} modes | {"For Share"} pids | {5892}
=> COMMIT;
| => ROLLBACK;
рдЬрдордиреЗ рдХреА рд╕реЗрдЯрд┐рдВрдЧ
рдЪреВрдВрдХрд┐ рдорд▓реНрдЯреАрдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирдВрдмрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ xmax рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдХрд╛рдЙрдВрдЯрд░ рдХреА рдмрд┐рдЯ рдХреНрд╖рдорддрд╛ рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг, рд╡реЗ рдПрдХ рд╣реА xid рд░реИрдкрд░рд╛рдЙрдВрдб
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ред
рдЗрд╕рд▓рд┐рдП, рдмрд╣реБ-рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдардВрдб рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдкреБрд░рд╛рдиреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ (рдпрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдардВрдб рдХреЗ рд╕рдордп рддрд╛рд▓рд╛ рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЬрдорд╛рд╡ рдХреЗрд╡рд▓ xmin рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЧреИрд░-рдЦрд╛рд▓реА xmax рдлрд╝реАрд▓реНрдб рд╣реИ, рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ xmax рд▓реЗрдирджреЗрди рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИ)ред рд▓реЗрдХрд┐рди рдмрд╣реБ-рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд╛рдЗрди рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ xmax рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдЭрд╛ рдореЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╣реБ
-рд▓реЗрди-рджреЗрди рдХреЗ рдардВрдб рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рдардВрдб рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░
рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ :
рд╡реИрдХреНрдпреВрдо_рдореВрд▓реНрдЯрд┐рдХреНрдЯ_рдлреНрд░реАрдЬ_рдорд┐рди_рдПрдЬ ,
рд╡реИрдХреНрдпреВрдо_рдорд▓реНрдЯрд┐рдХреНрдЯ_рдлреНрд░реАрдЬ_рдЯреЗрдмрд▓_рдПрдЬ ,
рдСрдЯреЛрд╡реИрдХреНрдпреВрдо_рдорд╛рдЗрд▓реЗрдЯрд┐рдХреНрд╕_рдлреНрд░реАрдЬ_рдореИрдХреНрд╕_рдорд╛рдЬ ред
рдЕрддрд┐ рдХреМрди рд╣реИ?
рдзреАрд░реЗ-рдзреАрд░реЗ рдорд┐рдард╛рдИ рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪреЗрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рддрд╛рд▓реЗ рдХреА рддрд╕реНрд╡реАрд░ рдХреНрдпрд╛ рд╣реИ рдЬрдм рдХрдИ рд▓реЗрдирджреЗрди рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдЪрд▓рд┐рдП pg_locks рдкрд░ рдПрдХ рджреГрд╢реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рддрд╛рд▓реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦреЗрдВрдЧреЗ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЖрднрд╛рд╕реА рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рддрд╛рд▓реЗ рдХреЛ рддреНрдпрд╛рдЧ рджреЗрддреЗ рд╣реИрдВ, рдЦрд╛рддреЗ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ, pg_locks рдФрд░ рдЦреБрдж рдХреЛ рджреЗрдЦреЗрдВ - рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рд╕рдм рдХреБрдЫ рдЬреЛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рднрдВрдЧ рдХрд░рдирд╛)ред
=> CREATE VIEW locks_v AS SELECT pid, locktype, CASE locktype WHEN 'relation' THEN relation::regclass::text WHEN 'transactionid' THEN transactionid::text WHEN 'tuple' THEN relation::regclass::text||':'||tuple::text END AS lockid, mode, granted FROM pg_locks WHERE locktype in ('relation','transactionid','tuple') AND (locktype != 'relation' OR relation = 'accounts'::regclass);
рдЕрдм рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
=> BEGIN; => SELECT txid_current(), pg_backend_pid();
txid_current | pg_backend_pid --------------+---------------- 530497 | 5892 (1 row)
=> UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
UPDATE 1
рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
=> SELECT * FROM locks_v WHERE pid = 5892;
pid | locktype | lockid | mode | granted ------+---------------+----------+------------------+--------- 5892 | relation | accounts | RowExclusiveLock | t 5892 | transactionid | 530497 | ExclusiveLock | t (2 rows)
рд▓реЗрди-рджреЗрди рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЙрдХ рд░рдЦрддрд╛ рд╣реИред рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред
рд╣рдо рджреВрд╕рд░рд╛ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реА рд▓рд╛рдЗрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
| => BEGIN; | => SELECT txid_current(), pg_backend_pid();
| txid_current | pg_backend_pid | --------------+---------------- | 530498 | 5928 | (1 row)
| => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
рджреВрд╕рд░реЗ рд▓реЗрди-рджреЗрди рдХреЗ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
=> SELECT * FROM locks_v WHERE pid = 5928;
pid | locktype | lockid | mode | granted ------+---------------+------------+------------------+--------- 5928 | relation | accounts | RowExclusiveLock | t 5928 | transactionid | 530498 | ExclusiveLock | t 5928 | transactionid | 530497 | ShareLock | f 5928 | tuple | accounts:1 | ExclusiveLock | t (4 rows)
рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рджреЛ рдФрд░ рддрд╛рд▓реЗ рджреЗрдЦрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд▓реЗрди-рджреЗрди рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрд╣рд▓реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рдирдВрдмрд░ (рджреА рдЧрдИ = f) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ "рд▓рдЯрдХрд╛ рд╣реБрдЖ" рдерд╛ред рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ (рд▓реЙрдХрдЯрд╛рдЗрдк = рдЯреНрдпреВрдкрд▓) рдХрд╣рд╛рдВ рдФрд░ рдХреНрдпреЛрдВ рдЖрдпрд╛?
рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ (рдЯреБрдкрд▓ рд▓реЙрдХ) рдФрд░ рдкрдВрдХреНрддрд┐ рд▓реЙрдХ (рдкрдВрдХреНрддрд┐ рд▓реЙрдХ) рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЯрдкрд▓ рдЯрд╛рдЗрдк рд▓реЙрдХ рд╣реИ, рдЬреЛ pg_locks рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рдЪрд┐рд╣реНрди рд╣реИ: xmax рдФрд░ рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ред
рдЬрдм рдХреЛрдИ рд▓реЗрди-рджреЗрди рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдХрд░рддрд╛ рд╣реИ:
- рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЯреБрдкрд▓) рдХреЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЙрдХ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред
- рдпрджрд┐ xmax рдФрд░ рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрдЦрд╛ рд▓реЙрдХ рд╣реИ, рддреЛ рдпрд╣ xmax рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
- рдЗрд╕рдХреЗ xmax рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕реВрдЪрдирд╛ рдмрд┐рдЯреНрд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
рдЬрдм рдкрд╣рд▓реА рд▓реЗрди-рджреЗрди рджреНрд╡рд╛рд░рд╛ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрд╕рдиреЗ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ (рдЪрд░рдг 1) рдХреЛ рднреА рдкрдХрдбрд╝ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдЗрд╕реЗ (рдЪрд░рдг 4) рдЬрд╛рд░реА рдХрд░ рджрд┐рдпрд╛ред
рдЬрдм рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди рдЖрдпрд╛, рддреЛ рдЙрд╕рдиреЗ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ (рдЖрдЗрдЯрдо 1) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдирдВрдмрд░ (рдЖрдЗрдЯрдо 2) рдХреЗ рд▓реЙрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрджрд┐ рддреАрд╕рд░рд╛ рд╕рдорд╛рди рд▓реЗрдирджреЗрди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╡рд╣ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг (рдЖрдЗрдЯрдо 1) рдХреЗ рд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧреА рдФрд░ рдЗрд╕ рдХрджрдо рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдЯрдХрд╛рдПрдЧреАред рдЗрд╕реЗ рджреЗрдЦреЗрдВред
|| => BEGIN; || => SELECT txid_current(), pg_backend_pid();
|| txid_current | pg_backend_pid || --------------+---------------- || 530499 | 5964 || (1 row)
|| => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
=> SELECT * FROM locks_v WHERE pid = 5964;
pid | locktype | lockid | mode | granted ------+---------------+------------+------------------+--------- 5964 | relation | accounts | RowExclusiveLock | t 5964 | tuple | accounts:1 | ExclusiveLock | f 5964 | transactionid | 530499 | ExclusiveLock | t (3 rows)
рдЪреМрдерд╛, рдкрд╛рдБрдЪрд╡рд╛рдБ рдЗрддреНрдпрд╛рджрд┐ рд▓реЗрди-рджреЗрди рдЬреЛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд▓реЗрди-рджреЗрди 3 рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ рдкрд░ "рд╣реИрдВрдЧ" рдХрд░реЗрдВрдЧреЗред
рдвреЗрд░ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЗрдирджреЗрди рдЬреЛрдбрд╝реЗрдВред
||| => BEGIN; ||| => SELECT txid_current(), pg_backend_pid();
||| txid_current | pg_backend_pid ||| --------------+---------------- ||| 530500 | 6000 ||| (1 row)
||| => UPDATE accounts SET amount = amount - 100.00 WHERE acc_no = 1;
=> SELECT * FROM locks_v WHERE pid = 6000;
pid | locktype | lockid | mode | granted ------+---------------+------------+------------------+--------- 6000 | relation | accounts | RowExclusiveLock | t 6000 | transactionid | 530500 | ExclusiveLock | t 6000 | tuple | accounts:1 | ExclusiveLock | f (3 rows)
рд╡рд░реНрддрдорд╛рди рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд╕реНрд╡реАрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реБрдП pg_stat_activity рджреГрд╢реНрдп рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
=> SELECT pid, wait_event_type, wait_event, pg_blocking_pids(pid) FROM pg_stat_activity WHERE backend_type = 'client backend';
pid | wait_event_type | wait_event | pg_blocking_pids ------+-----------------+---------------+------------------ 5892 | | | {} 5928 | Lock | transactionid | {5892} 5964 | Lock | tuple | {5928} 6000 | Lock | tuple | {5928,5964} (4 rows)
рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ "рдХрддрд╛рд░" рдирд┐рдХрд▓рд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓рд╛ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓реЙрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛) рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЬреЛ рдкрд╣рд▓реЗ рдХреЗ рдкреАрдЫреЗ рд▓рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╖реНрдХреГрдд рдбрд┐рдЬрд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рджреВрд╕рд░рд╛ рдФрд░ рддреАрд╕рд░рд╛ (рдФрд░ рдЗрд╕реА рддрд░рд╣) рд▓реЗрдирджреЗрди рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдкрд╣рд▓реЗ рд▓реЗрди-рджреЗрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ, рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрди рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (
рдФрд░ рдЖрдк рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрд╣? рд▓реЗрди-рджреЗрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ ) рдФрд░ рдЕрдм рдпрд╣ рд╕рдм рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдХреМрди рд╕реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬрдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд▓рд╛рдЗрди рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рднреА рдЬрд╛рдЧреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдХрддрд╛рд░ рдореЗрдВ рд▓рдЧрдирд╛ рд╣реЛрдЧрд╛ - рдЕрдм рдПрдХ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рджред
рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рднрд░рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЗрди-рджреЗрди рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдЕрдкрдиреА рдмрд╛рд░реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рд╣рдореЗрд╢рд╛ рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓реЗрдЧрд╛ред рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реЙрдХ рднреБрдЦрдорд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ: рджреВрд╕рд░реЗ рдореЗрдВ рдЖрдП рд▓реЗрдирджреЗрди рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рддреАрд╕рд░реЗ рдФрд░ рдЖрдЧреЗ) рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
рдпрджрд┐ рдкрд╣рд▓рд╛ рд▓реЗрди-рджреЗрди рд░реЛрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛: рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╡реЗ рдкрдВрдХреНрддрд┐рдмрджреНрдз рдереЗред
рд▓реЗрдХрд┐рди - рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╣реИ - рдпрджрд┐ рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди рдПрдХ рдХрдорд┐рдЯ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рди рдХреЗрд╡рд▓ рд▓реЗрдирджреЗрди рд╕рдВрдЦреНрдпрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рд▓рд╛рдЗрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА! рдпрд╣реА рд╣реИ, рд╕рдВрд╕реНрдХрд░рдг, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг (рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХрд╛) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╕рдВрд╕рд╛рдзрди, рдЬреЛ рдореЛрдбрд╝ рдерд╛, рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдХреЛрдИ рдПрдХ рдирдП рд╕рдВрд╕рд╛рдзрди рдХреЗ рдХрдмреНрдЬреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреМрдбрд╝ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рдХрдорд┐рдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рд╣реЛрдиреЗ рджреЗрдВред
=> COMMIT;
рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди рдЬрд╛рдЧ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред 3 рдФрд░ 4ред
| UPDATE 1
=> SELECT * FROM locks_v WHERE pid = 5928;
pid | locktype | lockid | mode | granted ------+---------------+----------+------------------+--------- 5928 | relation | accounts | RowExclusiveLock | t 5928 | transactionid | 530498 | ExclusiveLock | t (2 rows)
рддреАрд╕рд░реЗ рд▓реЗрди-рджреЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╡рд╣ рдЪрд░рдг 1 рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕рд╛рдзрди рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдЪрд░рдг 2 рдкрд░ рдЕрдЯрдХ рдЬрд╛рддрд╛ рд╣реИ:
=> SELECT * FROM locks_v WHERE pid = 5964;
pid | locktype | lockid | mode | granted ------+---------------+----------+------------------+--------- 5964 | relation | accounts | RowExclusiveLock | t 5964 | transactionid | 530498 | ShareLock | f 5964 | transactionid | 530499 | ExclusiveLock | t (3 rows)
рдФрд░ рдЪреМрдереЗ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ:
=> SELECT * FROM locks_v WHERE pid = 6000;
pid | locktype | lockid | mode | granted ------+---------------+----------+------------------+--------- 6000 | relation | accounts | RowExclusiveLock | t 6000 | transactionid | 530498 | ShareLock | f 6000 | transactionid | 530500 | ExclusiveLock | t (3 rows)
рдпрд╣реА рд╣реИ, рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рджреЛрдиреЛрдВ рд▓реЗрдирджреЗрди рджреВрд╕рд░реЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓рд╛рдЗрди
рдХрджреНрджреВ рднреАрдбрд╝ рдореЗрдВ рдмрджрд▓ рдЧрдИред
рд╣рдо рд╕рднреА рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
| => COMMIT;
|| UPDATE 1
|| => COMMIT;
||| UPDATE 1
||| => COMMIT;
рдЕрд╡рд░реБрджреНрдз рддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг README.tuplock рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рдпрд╣рд╛рдВ рдЦрдбрд╝реЗ рдирд╣реАрдВ рдереЗ
рддреЛ, рджреЛ-рд╕реНрддрд░реАрдп рдЕрд╡рд░реЛрдзрди рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ "рдЦрд░рд╛рдм рднрд╛рдЧреНрдп" рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдЕрдирдиреНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рдФрд░ рдЕрдЧрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рджреБрдЦреА рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рд╕рд╛рдЭрд╛ рдореЛрдб рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рджреЗрдВред
=> BEGIN; => SELECT txid_current(), pg_backend_pid();
txid_current | pg_backend_pid --------------+---------------- 530501 | 5892 (1 row)
=> SELECT * FROM accounts WHERE acc_no = 1 FOR SHARE;
acc_no | amount --------+-------- 1 | 100.00 (1 row)
рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди - рд╢реЗрдпрд░ рдФрд░ рдХреЛрдИ рдкреНрд░рдореБрдЦ рдЕрджреНрдпрддрди рдореЛрдб рдЕрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред
| => BEGIN; | => SELECT txid_current(), pg_backend_pid();
| txid_current | pg_backend_pid | --------------+---------------- | 530502 | 5928 | (1 row)
| => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
рджреВрд╕рд░рд╛ рд▓реЗрдирджреЗрди рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдХ рд░рдЦрддрд╛ рд╣реИ - рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣ рд╣реИред
=> SELECT * FROM locks_v WHERE pid = 5928;
pid | locktype | lockid | mode | granted ------+---------------+-------------+------------------+--------- 5928 | relation | accounts | RowExclusiveLock | t 5928 | tuple | accounts:10 | ExclusiveLock | t 5928 | transactionid | 530501 | ShareLock | f 5928 | transactionid | 530502 | ExclusiveLock | t (4 rows)
рдФрд░ рдлрд┐рд░ рдПрдХ рддреАрд╕рд░рд╛ рд▓реЗрдирджреЗрди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдЭрд╛ рд▓реЙрдХ рдЪрд╛рд╣рддрд╛ рд╣реИред рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдмрд╕ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред
|| BEGIN || => SELECT txid_current(), pg_backend_pid();
|| txid_current | pg_backend_pid || --------------+---------------- || 530503 | 5964 || (1 row)
|| => SELECT * FROM accounts WHERE acc_no = 1 FOR SHARE;
|| acc_no | amount || --------+-------- || 1 | 100.00 || (1 row)
рдФрд░ рдЕрдм рджреЛ рд▓реЗрдирджреЗрди рдкрдВрдХреНрддрд┐ рдХреЛ рд░реЛрдХ рд░рд╣реЗ рд╣реИрдВ:
=> SELECT * FROM pgrowlocks('accounts') \gx
-[ RECORD 1 ]--------------- locked_row | (0,10) locker | 62 multi | t xids | {530501,530503} modes | {Share,Share} pids | {5892,5964}
рдкрд╣рд▓рд╛ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдм рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рджреВрд╕рд░рд╛ рд▓реЗрди-рджреЗрди рдЬрд╛рдЧ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкрдВрдХреНрддрд┐ рд▓реЙрдХ рдХрд╣реАрдВ рднреА рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗ "рдХрддрд╛рд░" рдореЗрдВ рдЦрдбрд╝рд╛ рд╣реЛрдЧрд╛ - рдЗрд╕ рдмрд╛рд░ рддреАрд╕рд░реЗ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП:
=> COMMIT; => SELECT * FROM locks_v WHERE pid = 5928;
pid | locktype | lockid | mode | granted ------+---------------+-------------+------------------+--------- 5928 | relation | accounts | RowExclusiveLock | t 5928 | tuple | accounts:10 | ExclusiveLock | t 5928 | transactionid | 530503 | ShareLock | f 5928 | transactionid | 530502 | ExclusiveLock | t (4 rows)
рдФрд░ рдХреЗрд╡рд▓ рдЬрдм рддреАрд╕рд░рд╛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдпрджрд┐ рдЗрд╕ рджреМрд░рд╛рди рдХреЛрдИ рдЕрдиреНрдп рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд╛рд▓реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ), рддреЛ рджреВрд╕рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
|| => COMMIT;
| UPDATE 1
| => ROLLBACK;
рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
- рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
- рдпрджрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд╛рдЭрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдЭрд╛ рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХрд░реЗрдВред
- рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдореБрдЦ рдлрд╝реАрд▓реНрдб рдЖрдорддреМрд░ рдкрд░ рдмрджрд▓рддреА рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХреБрдВрдЬреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ рдХреЛрдИ рдХреБрдВрдЬреА рдЕрджреНрдпрддрди рдореЛрдб рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред
рдЙрдзрд╛рд░ рди рд▓реЗрдиреЗ рдХреЛ рдХрд╣рд╛
рдЖрдорддреМрд░ рдкрд░, SQL рдХрдорд╛рдВрдб рдХреЛ рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдк рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рд▓реЙрдХ рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SELECT, LOCK, ALTER рдЬреИрд╕реЗ рдХрдорд╛рдВрдб рдЖрдкрдХреЛ NowAIT рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
=> BEGIN; => UPDATE accounts SET amount = amount + 100.00 WHERE acc_no = 1;
| => SELECT * FROM accounts FOR UPDATE NOWAIT;
| ERROR: could not obtain lock on row in relation "accounts"
рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╕реНрдд рд╣реИ, рддреЛ рдХрдорд╛рдВрдб рддреБрд░рдВрдд рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд╡рд░реЛрдзрди рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк UPDATE рдФрд░ DELETE рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП NowAIT рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рдЪрдпрди рдХрд░реЗрдВ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдЕрджреНрдпрддрди рдХрд░реЗрдВ рдпрд╛ рд▓рд╛рдЗрди рд╣рдЯрд╛рдПрдВред
рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ - SKIP LOCKED рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд╕рд╛рде SELECT FOR рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдорд╛рдВрдб рд▓реЙрдХ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдореБрдлреНрдд рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧреАред
| => BEGIN; | => DECLARE c CURSOR FOR | SELECT * FROM accounts ORDER BY acc_no FOR UPDATE SKIP LOCKED; | => FETCH c;
| acc_no | amount | --------+-------- | 2 | 200.00 | (1 row)
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкрд╣рд▓реА - рдЕрд╡рд░реБрджреНрдз - рд░реЗрдЦрд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╣рдо рддреБрд░рдВрдд рджреВрд╕рд░реЗ (рдФрд░ рдЕрд╡рд░реБрджреНрдз) рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рдереЗред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдХрддрд╛рд░реЛрдВ рдХреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЖрд╡реЗрджрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреА рджреГрд╖реНрдЯрд┐ рдЦреЛ рджреЗрдВрдЧреЗред
=> ROLLBACK;
| => ROLLBACK;
рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдП ред