рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рд▓реЗрди-рджреЗрди рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред Spoiler: рдпрд╣ PostgreSQL рдореЗрдВ рд╕рд▓рд╛рд╣рдХрд╛рд░ рддрд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛!
рдореИрдВрдиреЗ рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рд╕реЗ рднрд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рднрд╛рд░реА рдПрдВрдЯрд┐рдЯреАрдЬрд╝ (рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрд╛рдж рдХрд╣рддреЗ рд╣реИрдВ) рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдФрд░ рднреА рд╡рд┐рд╡рд┐рдз рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реИрдХрдбрд╝реЛрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд┐рд╕реА рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдареЛрд╕ рд╕рдордп (30-60 рд╕реЗрдХрдВрдб) рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдердХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдордп "рд░рджреНрдж рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ рдХреНрд╖рдг рддрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред
"рдмрд╛рдзрд┐рдд рдЖрдпрд╛рдд" рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдиреЗрдордкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдХрд╛рд░реНрдп рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдЖрдпрд╛рдд рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛, рдЗрд╕реЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛, рдФрд░ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдпрджрд┐ рддрдм рддрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдЪреБрдкрдЪрд╛рдк рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдпрд╛рдд рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдпрд╣реА рд╡рд╣ рд╣реИред
рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдд рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ - рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдЬрд╛рдЗрди рд╕рд░рд▓ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдмрдЧ рдерд╛ред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдереА: тАЬрдЖрдпрд╛рдд рд░рджреНрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕рдХреЗ рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдкреГрд╖реНрда рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдХрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реИред " рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ - рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ "рд░рджреНрдж рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛, рддреЛ рдЙрд╕реЗ рддреБрд░рдВрдд рд╕рднреА рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╕рд╛рдорд╛рдиреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рд╢реБрд░реВ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред
рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╣реИрд░рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рддрд░реАрдХреЗ рдереЗ: рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ "рдорд╛рд░рдирд╛", рдпрд╛ рдЬрдм рдореИрдВ рд░рджреНрдж рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реВрдВ, рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдПрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдЦреБрдж рдХреА рдореГрддреНрдпреБ" рди рдХрд░реЗрдВред рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЪреБрдирд╛ - рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ред
рд▓реЗрди-рджреЗрди рддрд╛рд▓реЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рднрд╛рдЧрддреЗ рд╣реИрдВ
(рд░рд┐рд▓реЗрд╢рдирд▓) рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ !
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд░рдбреАрдмреАрдПрдордПрд╕ рдореЗрдВ, рд▓реЗрди-рджреЗрди рдХреЗ рднреАрддрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдмреНрд▓реЙрдХ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЬрдм рддрдХ рдпрд╣ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЧрдоред рд╕реЗрд▓реЗрдХреНрдЯ SELECT FOR UPDATE
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреБрдиреЗ рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреЛ рднреА рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдмрд┐рд▓реНрдХреБрд▓ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ! рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рд▓реЗрди-рджреЗрди рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рдкреЗрдЯрд╛ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдХрд╛рд░реНрдп рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛:
ActiveRecord::Base.transaction do task = Import::Task.lock.find_by(id: id)
рдЕрдм, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдпрд╛рдд рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдпрд╛рдд рд░реЛрдХ рд╕рдВрдЪрд╛рд▓рди рдЙрди рдЖрдпрд╛рддреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ рдЬреЛ рдЕрднреА рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд▓реЛрдЧреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдВрдЧреЗ:
user.import_tasks.delete_all
рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг! рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдП, рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдФрд░ рдордВрдЪрди рдореЗрдВ рдЖрдпрд╛рдд рдХреА рдЬрд╛рдБрдЪ рдХреА, рдФрд░ "рд▓рдбрд╝рд╛рдИ рдореЗрдВ" рддреИрдирд╛рдд рдХрд┐рдпрд╛ред
рдЗрддрдиреА рдЬрд▓реНрджреА рдирд╣реАрдВ ...
рдЕрдкрдиреЗ рдХрд╛рдо рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ, рдореИрдВ рдЬрд▓реНрдж рд╣реА рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЯрди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛ред рдХрдИ рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рднреА рдЖрдпрд╛рддреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрддреНрдкрд╛рдж рд░рд╣ рд╕рдХрддрд╛ рд╣реИред
рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛ рддреЛ рдЙрддреНрд╕рд╛рд╣рдЬрдирдХ рдирд╣реАрдВ рдереАрдВ: PG::InFailedSqlTransaction
рдПрдХ рдмреИрдХрдЯреНрд░реИрдХ рдХреЗ рд╕рд╛рде рдЙрд╕ рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдирд┐рд░реНрджреЛрд╖ SELECT
рдПрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЖрдЦрд┐рд░ рд╣реЛ рдХреНрдпрд╛ рд░рд╣рд╛ рд╣реИ?
рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдПрдХ рджрд┐рди рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рддреАрди рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА:
- рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ред
- рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж PostgreSQL рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдирджреЗрди рд░рджреНрдж рдХрд░рдирд╛ред
- рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЪреБрдкреНрдкреА (рд░реВрдмреА рдЕрдкрд╡рд╛рдж)ред
рд╕рдорд╕реНрдпрд╛ рдПрдХ: рд╕рдВрдШрд░реНрд╖рдкреВрд░реНрдг рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдпреЛрдЧреА рд╕рдореНрдорд┐рд▓рди
рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдд рдСрдкрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдорд┐рдирдЯ рддрдХ рдХрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред рдорд╛рд▓ рдХреЗ рдЖрд╢реНрд░рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдЗрд╕ рд╣рдж рддрдХ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рднреА рдЙрддреНрдкрд╛рдж рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдФрд░ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдПрдХ рдПрдХрд▓ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм, рдЬрдм рд╣рдо рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рдЪреЗрдХ рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдП рд╣реИрдВ : рдпрджрд┐ рд▓реЗрдирджреЗрди рдП рдиреЗ рдПрдХ рдЖрд╢реНрд░рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рдмреА рдЖрдкрдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдПрдЧрд╛ рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧред
рд╕рдорд╕реНрдпрд╛ рджреЛ: рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж PostgreSQL рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрди-рджреЗрди рд░рджреНрдж рдХрд░рдирд╛
рдмреЗрд╢рдХ, рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдбреАрдбреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрд╛:
ALTER TABLE product_deps ADD UNIQUE (user_id, characteristics);
рдпрджрд┐ рд▓реЗрди-рджреЗрди рдкреНрд░рдЧрддрд┐ рдореЗрдВ рд╣реИ рддреЛ рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реЗрдирджреЗрди B рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛_рдЖрдИрдбреА рдФрд░ characteristics
рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдирджреЗрди B рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА:
BEGIN; INSERT INTO product_deps (user_id, characteristics) VALUES (1, '{"same": "value"}');
рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП - рд▓реЗрдирджреЗрди рдмреА, рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рдо рдирд╛рд▓реА рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдПрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд▓реЗрди-рджреЗрди рдЕрднреА рднреА рдПрдХ "рдЧрд▓рдд" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЦреБрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
SELECT * FROM products; ERROR: current transaction is aborted, commands ignored until end of transaction block
рдЦреИрд░, рдпрд╣ рдХрд╣рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдирджреЗрди рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рдмрдЪрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛:
COMMIT;
рд╕рдорд╕реНрдпрд╛ рддреАрди: рдореМрди
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдмрд╕ рдЖрд╡реЗрджрди рдореЗрдВ рд▓реЗрдирджреЗрди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЗрд╕реЗ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛: рдореБрдЭреЗ рдЖрдпрд╛рдд рдХреЛрдб рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдирд╛ рдкрдбрд╝рд╛ред рдХреЛрдб рдореЗрдВ, рдмрд╣реБрдд рдмрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЯрд░реНрди рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд▓рдЧреЗ:
def process_stuff(data)
рдпрд╣рд╛рдВ рдХреЛрдб рд▓реЗрдЦрдХ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ: "рд╣рдордиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рд╣рдо рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдП, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред" рдФрд░ рдпрджреНрдпрдкрд┐ рдЗрд╕ рдкрд╕рдВрдж рдХреЗ рдХрд╛рд░рдг рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░ рд╕рдм рдХреБрдЫ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд▓реЗрдирджреЗрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ: рдПрдХ рдлреЗрдВрдХрд╛ рд╣реБрдЖ рдирд┐рд╖реНрдкрд╛рджрди transaction
рдмреНрд▓реЙрдХ рддрдХ рдирд╣реАрдВ рдЬрд╛ рд╕рдХреЗрдЧрд╛, рдФрд░ рдПрдХ рд╕рд╣реА рд░реЛрд▓рдмреИрдХ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд▓реЗрдирджреЗрди (ActiveRecord рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрди-рджреЗрди рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ)ред
рдПрдХрджрдо рд╕рд╣реА рддреВрдлрд╛рди
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпреЗ рддреАрдиреЛрдВ рдХрд╛рд░рдХ рдПрдХ рд╕рд╛рде рдкрд░рд┐рдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдП рддреВрдлрд╛рди рдмрдЧ:
- рд▓реЗрдирджреЗрди рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рд░рд┐рдХреЙрд░реНрдб рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ PostgreSQL рд╕реЗ "рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреБрдВрдЬреА" рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд▓реЗрди-рджреЗрди рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рдПрдХ рднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ "hushed" рд╣реЛрддрд╛ рд╣реИред
- рд▓реЗрди-рджреЗрди рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░ "рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ", рд▓реЗрдХрд┐рди рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рднреА рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...
- рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЧрдП рдереЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреБрдЫ рдЯреВрдЯрдирд╛ рдЬрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдм рддрдХ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдИ рдЕрддреНрдпрдзрд┐рдХ рд▓рд╛рд▓рдЪреА
rescue
рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдЕрдВрддрддрдГ рдкреЙрдк рдЕрдк рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ, рддреНрд░реБрдЯрд┐ рдЯреНрд░реИрдХрд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд - рдХреБрдЫ рднреАред рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдЧрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реЛрдЧреА рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рдмрди рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдХреЗрд▓реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдмреБрд░реЗ рд╕рдкрдиреЗ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред
PostgreSQL рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреЗ рддрд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ
рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ rescue
рд▓рд┐рдП рд╢рд┐рдХрд╛рд░ рдХрд░рдирд╛ рдФрд░ рд╕рднреА рдЖрдпрд╛рдд рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдПрдХ рд▓рдВрдмрд╛ рд╕рдордпред рдореБрдЭреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдФрд░ рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛! рдЗрд╕рдореЗрдВ рддрд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрди-рджреЗрди рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдмреИрдардХ-рд╕рддреНрд░-рд╕рд▓рд╛рд╣рдХрд╛рд░ рддрд╛рд▓реЗред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд░реИрдкрд┐рдВрдЧ рд▓реЗрдирджреЗрди рдХреЛ рдкрд╣рд▓реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦреБрд▓реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЛрдб рд╕реЗ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп "рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ") рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рднрд▓реЗ рд╣реА рдЖрдк рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗрди-рджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ, рд▓реЗрдХрд┐рди рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред , рдФрд░ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рдПрдХ рдЕрдЬреАрдм рдФрд░ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрд╕реЛрд▓реЗрдЯрд░ рд░рддреНрди рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЛ рд▓реЗрдирджреЗрди рд╕реЗ рдареАрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдд рдСрдкрд░реЗрд╢рди рдореЗрдВ, рдореИрдВ рд╕рдВрдкреВрд░реНрдг рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рдкрд░ рдПрдХ рд╕рд╛рдЭрд╛ рд▓реЙрдХ рд▓реЗрддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдФрд░ рдСрдкрд░реЗрд╢рди рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╕реЗ рд╣реИрд╢):
SELECT pg_advisory_lock_shared(42, user.id);
рдПрдХ рд╣реА рдХреБрдВрдЬреА рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд╛рд▓реЗ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдпрд╛рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рдХрд╛рд░реНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдХреБрдВрдЬреА рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЙрдХ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрд╕реЗ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рд╕рд╛рдЭрд╛ рддрд╛рд▓реЗ рдЬрд╛рд░реА рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ:
SELECT pg_advisory_lock(42, user.id)
рдФрд░ рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм "рд░рджреНрджреАрдХрд░рдг" рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА "рдЪрд▓ рд░рд╣реЗ" рдЖрдпрд╛рдд рдкреВрд░реЗ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдЬрдм рд╣рдо рд▓реЗрди-рджреЗрди рд╕реЗ рдирд╣реАрдВ рдЬреБрдбрд╝реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЖрдпрд╛рдд рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдХреБрдЫ рдЖрдпрд╛рдд "рдЪрд┐рдкрдХ рдЬрд╛рддрд╛ рд╣реИ"), рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдмрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ):
transaction do execute("SET LOCAL lock_timeout = '30s'") execute("SELECT pg_advisory_lock(42, user.id)") rescue ActiveRecord::LockWaitTimeout nil
transaction
рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд╣рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ActiveRecord рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрди-рджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓реЗрдЧрд╛ ред
рд▓реЗрдХрд┐рди рд╕рдорд╛рди рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕рдореНрдорд┐рд▓рди рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЬреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрди-рджреЗрди рдХреЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рд╡реЗ рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЖрд╡реЗрд╖рдгреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░реЗрдВрдЧреЗ:
INSERT тАж ON CONFLICT UPDATE
рджреВрд╕рд░реЗ рд▓реЗрди-рджреЗрди рдореЗрдВ INSERT тАж ON CONFLICT UPDATE
(рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрд╕ 9.5 рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдкрд▓рдмреНрдз) рдХреЛ рддрдм рддрдХ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд╣ рд░рд┐рдХреЙрд░реНрдб рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред- рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓реЙрдХ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рд╣рдо рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рджрд┐рдЦрд╛рдИ рди рджреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рди рдХрд░ рд╕рдХреЗред
- рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрд╢рдВрд╕рд╛ рд▓реЙрдХ рд▓реЗрдВ - рдпрд╣ рдкреНрд░рднрд╛рд╡ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред
рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЖрдзрд╛рд░ рд╕реНрддрд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд┐рд░реНрдл рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
def import_all_the_things
рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдЕрдм рд▓реЗрди-рджреЗрди рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдкрдЯреЗред
рд╡реЗ рдЕрд╡рд░реБрджреНрдз рдХреНрдпреЛрдВ рд╣реИрдВ?
UNIQUE рдФрд░ EXCLUDE рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдХрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрддрдВрдн рдкрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рд╣реИ рдФрд░ рдПрдХ рд▓реЗрдирджреЗрди 5 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдЬреЛ 5 рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди 6 рдпрд╛ 4 рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдирджреЗрди рдмрд┐рдирд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рддреБрд░рдВрдд рд╕рдлрд▓ рд╣реЛрдВрдЧреЗред рдЪреВрдВрдХрд┐ PostgreSQL рдХрд╛ рдиреНрдпреВрдирддрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрди-рджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ READ COMMITED
, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд▓реЗрди-рджреЗрди рдЕрдиреНрдп рд▓реЗрди-рджреЗрди рд╕реЗ READ COMMITED
рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╣рдХрджрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ INSERT
рдХреЛ рддрдм рддрдХ рд╕реНрд╡реАрдХрд╛рд░ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд▓реЗрди-рджреЗрди рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ (рддрдм рджреВрд╕рд░рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рддрд╛ рд╣реИ (рдлрд┐рд░ рджреВрд╕рд░реЗ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рд╕рдлрд▓ рд╣реЛрдЧрд╛)ред EXCLUDE рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред
рднрд╡рд┐рд╖реНрдп рдХреА рдЖрдкрджрд╛ рдХреЛ рд░реЛрдХреЗрдВ
рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдХреЛрдб рд▓реЗрдирджреЗрди рдореЗрдВ рдирд╣реАрдВ рд▓рдкреЗрдЯреЗ рдЬрд╛ рд╕рдХрддреЗред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореЗрд░реА рдЧрд▓рддреА рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд▓реЗрдирджреЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рди рдХрд░реЗред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕рд╣рд╛рдпрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рд▓рд┐рдкрдЯреЗ рдСрдкрд░реЗрд╢рди рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрди-рджреЗрди рдЦреБрд▓рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдпрд╣рд╛рдБ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд╛рди рд╣реИ - call
рд╡рд┐рдзрд┐)ред
рдЕрдм, рдпрджрд┐ рдХреЛрдИ рд▓реЗрди-рджреЗрди рдореЗрдВ рдХрд┐рд╕реА рдЦрддрд░рдирд╛рдХ рд╕реЗрд╡рд╛ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рддреБрд░рдВрдд рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА (рдЬрдм рддрдХ рдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд╣ рдЗрд╕реЗ рдЪреБрдк рдирд╣реАрдВ рд░рдЦрддрд╛)ред
рдкрд░рд┐рдгрд╛рдо
рд╕реАрдЦрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рд╕рдмрдХ: рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдм рдХреБрдЫ рди рд╕рдВрднрд╛рд▓реЗрдВ, рдХреЗрд╡рд▓ рдЙрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рд▓реЛрдЧреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рджреЗрдВред рдХрднреА рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рди рдХрд░реЗрдВ (рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЖрдк 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдордд рдХрд░реЛред рдпрд╣ рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рд░рддреНрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдФрд░ after_commit_everywhere рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд╡реЗ рдЖрдкрдХреЗ рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд░реНрдЦ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ?
рдЕрд╡рдзреА рдЧреНрд░рд┐рдо рджреНрд╡рд╛рд░рд╛ рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдмреА ред рдпрд╣ рд▓рдШреБ рдкреБрд╕реНрддрдХ рдЖрдкрдХреЛ рд╕рд┐рдЦрд╛рдПрдЧреА рдХрд┐ рд░реВрдмреА рдореЗрдВ рдореМрдЬреВрджрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдХреИрд╕реЗ рдареАрдХ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВред
@Brandur рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкрд░рдорд╛рдгреБ рдПрдкреАрдЖрдИ рдХреЛ рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд░рдорд╛рдгреБ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред рдЙрдирдХреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛, рд░реВрдмреА рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рд╣реИрдВред