11 рдЬреВрди 2025┬╖8 рдорд┐рдирдЯ рдкрдврд╝рдиреЗ рдореЗрдВ

рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ: рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рд░реЛрдХреЗрдВ

рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдореЗрдВ optimistic locking рд╕реАрдЦреЗрдВ тАФ version рдХреЙрд▓рдо рдФрд░ `updated_at` рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде, рдФрд░ рдПрдбрд┐рдЯ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рдХреЛ рдмрд┐рдирд╛ рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рд╣реБрдП рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ рдЗрд╕рдХреА рд╕рд░рд▓ UI рдкрджреНрдзрддрд┐рдпрд╛рдБред

рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ: рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рд░реЛрдХреЗрдВ

рд╕рдорд╕реНрдпрд╛: рдХрдИ рд▓реЛрдЧ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рд╣реЛрдирд╛

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

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

рдпрд╣ рдмреИрдХ-рдСрдлрд┐рд╕ рдЯреВрд▓реНрд╕ рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рдо рд╕рд╣рдпреЛрдЧреА рдФрд░ рд░рд┐рдХреЙрд░реНрдб-рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рдЯреАрдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдПрдХ рд╣реА рдЧреНрд░рд╛рд╣рдХ, рдСрд░реНрдбрд░, рдЙрддреНрдкрд╛рдж рдФрд░ рдЕрдиреБрд░реЛрдз рдПрдбрд┐рдЯ рдХрд░рддреА рд╣реИрдВред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдРрдкреНрд╕ рдореЗрдВ рдЕрдХреНрд╕рд░ тАЬрдПрдХ рдпреВрдЬрд░ рдЕрдкрдиреА рдЪреАрдЬреЗрдВ рдПрдбрд┐рдЯ рдХрд░рддрд╛ рд╣реИтАЭ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдореЗрдВ тАЬрдХрдИ рдпреВрдЬрд░ рд╕рд╛рдЭрд╛ рдЪреАрдЬреЗрдВ рдПрдбрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВтАЭ рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреНрд╖рддрд┐ рдЕрдХреНрд╕рд░ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд▓рдЧрддреА, рдкрд░ рдпрд╣ рдЬрд▓реНрджреА рдмрдврд╝ рдЬрд╛рддреА рд╣реИ:

  • рдПрдХ рдЙрддреНрдкрд╛рдж рдХреА рдХреАрдордд рдкреБрд░рд╛рдиреА рд╡реИрд▓реНрдпреВ рдкрд░ рд╡рд╛рдкрд╕ рдЪрд▓реА рдЬрд╛рддреА рд╣реИ рдкреНрд░рдореЛ рдЕрдкрдбреЗрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рджред
  • рд╕рдкреЛрд░реНрдЯ рдПрдЬреЗрдВрдЯ рдХрд╛ рдЗрдВрдЯрд░рдирд▓ рдиреЛрдЯ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рд╡рд╣реА рдЯреНрд░рдмрд▓рд╢реВрдЯрд┐рдВрдЧ рджреЛрд╣рд░рд╛рдиреА рдкрдбрд╝рддреА рд╣реИред
  • рдПрдХ рдСрд░реНрдбрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдЙрд▓рдЯреА рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдЙрджрд╛. тАЬShippedтАЭ рд╕реЗ рд╡рд╛рдкрд╕ тАЬPackedтАЭ), рдЬрд┐рд╕рд╕реЗ рдЧрд▓рдд follow-up рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдлрд╝реЛрди рдирдВрдмрд░ рдпрд╛ рдкрддрд╛ рдкреБрд░рд╛рдирд╛ рд╣реЛ рдХрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рдЗрд▓реЗрдВрдЯ рдУрд╡рд░рд░рд╛рдЗрдЯ рдЗрд╕рд▓рд┐рдП рдХрд╖реНрдЯрджрд╛рдпрдХ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рд╕реЛрдЪрддрд╛ рд╣реИ рд╕рд┐рд╕реНрдЯрдо рдиреЗ рд╕рд╣реА рд╕реЗ рд╕реЗрд╡ рдХрд┐рдпрд╛ред рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ тАЬрдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖтАЭ рдХреНрд╖рдг рдирд╣реАрдВ рд╣реЛрддрд╛, рдмрд╕ рдмрд╛рдж рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдорд┐рдХреНрд╕ рджрд┐рдЦрддреА рд╣реИрдВ рдпрд╛ рдХреЛрдИ teammate рдкреВрдЫрддрд╛ рд╣реИ, тАЬрдпрд╣ рдХрд┐рд╕рдиреЗ рдмрджрд▓рд╛?тАЭ

рдРрд╕реЗ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ тАФ рдпрд╣ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдЯреВрд▓ рд╕рд╛рдЭрд╛ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИ, рди рдХрд┐ рдХрд┐ рдЯреАрдо рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣реА рд╣реИред рдЙрджреНрджреЗрд╢реНрдп рджреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдбрд┐рдЯ рди рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред

рдпрджрд┐ рдЖрдк AppMaster рдЬреИрд╕реЗ рдиреЛтАСрдХреЛрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЯреВрд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдпреЛрдЬрдирд╛ рдореЗрдВ рд░рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдЯреАрдореЗрдВ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдХрднреА-рдХрднреА рдбреЗрдЯрд╛ рдЦреЛрдирд╛ рднрд░реЛрд╕реЗ рдкрд░ рдЕрд╕рд░ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИред

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ

рдЬрдм рджреЛ рд▓реЛрдЧ рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ Save рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ concurrency рд╣реЛрддрд╛ рд╣реИред рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдПрдХ рдкреБрд░рд╛рдирд╛ snapshot рджреЗрдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА тАЬрдирд╡реАрдирддрдотАЭ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕реЗрд╡реНрд╕ рд╣реЛ рд░рд╣реА рд╣реЛрдВред

рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ, рдЖрдЦрд╝рд┐рд░реА рд╕реЗрд╡ рдЬреАрдд рдЬрд╛рддреА рд╣реИред рдпрд╣реА рд╕рд╛рдЗрд▓реЗрдВрдЯ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд╛ рдХрд╛рд░рдг рд╣реИ: рджреВрд╕рд░рд╛ рд╕реЗрд╡ рдЪреБрдкрдЪрд╛рдк рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред

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

рдпрд╣ pessimistic locking рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ тАЬрдореИрдВ рдЗрд╕реЗ рдПрдбрд┐рдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛тАЭ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдкреЗрд╕рд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдореЗрдВ рдЕрдХреНрд╕рд░ рд╣рд╛рд░реНрдб рд▓реЙрдХ, рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рд▓реЛрдЧ рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ (рдЬреИрд╕реЗ рдЦрд╛рддреЛрдВ рдХреЗ рдмреАрдЪ рдкреИрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд░) рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░ рд╡реНрдпрд╕реНрдд рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдореЗрдВ рдпрд╣ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдЖрдорддреМрд░ рдкрд░ рдмреЗрд╣рддрд░ рдбрд┐рдлреЙрд▓реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХреЛ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд░рдЦрддрд╛ рд╣реИред рд▓реЛрдЧ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрдбрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрдХрд░рд╛рд╡ рдкрд░ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рддрдм рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмреИрдарддрд╛ рд╣реИ рдЬрдм:

  • рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╕рдВрднрд╡ рд╣реИрдВ рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗред
  • рдПрдбрд┐рдЯ рдЬрд▓реНрджреА рд╣реЛрддреЗ рд╣реИрдВ (рдХреБрдЫ рдлрд╝реАрд▓реНрдб, рдПрдХ рдЫреЛрдЯрд╛ рдлреЙрд░реНрдо)ред
  • рджреВрд╕рд░реЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЯреАрдо рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛ред
  • рдЖрдк рдПрдХ рд╕рд╛рдл тАЬрдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛тАЭ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред
  • рдЖрдкрдХреА API рд╣рд░ рдЕрдкрдбреЗрдЯ рдкрд░ рдПрдХ рд╡рд░реНрд╢рди (рдпрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк) рдЬрд╛рдБрдЪ рд╕рдХрддреА рд╣реИред

рдпрд╣ "рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ" рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдЦреЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдлрд╝ рд░реЛрдХ рдорд┐рд▓рддрд╛ рд╣реИ: тАЬрдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЖрдкрдиреЗ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИредтАЭ

рдХреНрдпрд╛ рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рджреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ (рдкрд░ рд╡реИрдз) рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рдЬреЛ рджреЛрдиреЛрдВ рдкреБрд░рд╛рдиреЗ рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрд╡рддрдГ рд░реВрдк рд╕реЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдорд░реНрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░ рдЕрдЧрд░ рдЖрдк рдЪреЗрдХ рд╕рд░реНрд╡рд░тАСрд╕рд╛рдЗрдб рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рднреА рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗред

рдЖрдо рд╕реАрдорд╛рдПрдБ рдпрд╛рдж рд░рдЦреЗрдВ:

  • рдпрд╣ conflicts рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдЖрдкрдХреЛ рдирд┐рд░реНрдгрдп рдЪрд╛рд╣рд┐рдП)ред
  • рдпрд╣ рддрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдлрд╝рд▓рд╛рдЗрди рдПрдбрд┐рдЯ рдХрд░рдХреЗ рдмрд╛рдж рдореЗрдВ рдмрд┐рдирд╛ рдЪреЗрдХ рдХреЗ рд╕рд┐рдВрдХ рдХрд░реЗрдВред
  • рдпрд╣ permissions рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдХреЛрдИ рдЕрднреА рднреА рдЧрд▓рдд рдЬрдЧрд╣ рдПрдбрд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред
  • рдпрд╣ рддрднреА рдкрдХрдбрд╝рддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╕рд░реНрд╡рд░тАСрд╕рд╛рдЗрдб рдЪреЗрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЪреЗрдХ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рд╕рд┐рд░реНрдл рд╣рд░ рдПрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реИрд▓реНрдпреВ рднреЗрдЬрдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░тАСрд╕рд╛рдЗрдб рдкрд░ тАЬonly update if it matchesтАЭ рдирд┐рдпрдоред AppMaster рдореЗрдВ, рдпрд╣ рдЪреЗрдХ рдЖрдорддреМрд░ рдкрд░ рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдореЗрдВ рд╡рд╣реАрдБ рд░рд╣рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЕрдкрдбреЗрдЯ execute рд╣реЛрддреЗ рд╣реИрдВред

рджреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ: version рдХреЙрд▓рдо рдмрдирд╛рдо updated_at

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрджрд▓ рдЧрдпрд╛ рдерд╛, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рджреЛ рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЪреБрдирддреЗ рд╣реИрдВ: рдПрдХ version рдирдВрдмрд░ рдпрд╛ рдПрдХ updated_at рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкред

рддрд░реАрдХрд╛ 1: Version рдХреЙрд▓рдо (рдЗрдиреНрдХреНрд░реАрдореЗрдВрдЯрд┐рдВрдЧ рдЗрдиреНрдЯреАрдЬрд░)

рдПрдХ version рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ (рдЖрдорддреМрд░ рдкрд░ integer)ред рдЬрдм рдЖрдк рдПрдбрд┐рдЯ рдлреЙрд░реНрдо рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рде рдореЗрдВ рд╡рд░реНрддрдорд╛рди version рднреА рд▓реЛрдб рдХрд░реЗрдВред рдЬрдм рдЖрдк рд╕реЗрд╡ рдХрд░реЗрдВ, рддреЛ рд╡рд╣реА рд╡реИрд▓реНрдпреВ рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдВред

рдЕрдкрдбреЗрдЯ рдХреЗрд╡рд▓ рддрднреА рд╕рдлрд▓ рд╣реЛрдЧрд╛ рдЬрдм рд╕реНрдЯреЛрд░реНрдб version рд╡рд╣реА рд╣реЛ рдЬреЛ рдпреВрдЬрд░ рдиреЗ рд╢реБрд░реВ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред рдЕрдЧрд░ рдореИрдЪ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░рд┐рдХреЙрд░реНрдб рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ version рдХреЛ 1 рд╕реЗ рдмрдврд╝рд╛ рджреЗрдВред рдЕрдЧрд░ рдореИрдЪ рдирд╣реАрдВ рд╣реЛрддрд╛, рддреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ conflict рд▓реМрдЯрд╛рдПрдБред

рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ: version 12 рдХрд╛ рдорддрд▓рдм тАЬрдпрд╣ 12рд╡рд╛рдВ рдмрджрд▓рд╛рд╡ рд╣реИредтАЭ рдпрд╣ рдЯрд╛рдЗрдотАСрд╕рдВрдмрдВрдзреА рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рднреА рдмрдЪрддрд╛ рд╣реИред

рддрд░реАрдХрд╛ 2: updated_at (рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рддреБрд▓рдирд╛)

рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдЯреЗрдмрд▓реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ updated_at рдлрд╝реАрд▓реНрдб рд░рдЦрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рд╡рд╣реА рд╣реИ: рдлреЙрд░реНрдо рдЦреБрд▓рддреЗ рд╕рдордп updated_at рдкрдврд╝реЗрдВ, рдЗрд╕реЗ рд╕реЗрд╡ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рд╕рд░реНрд╡рд░ рдХреЗрд╡рд▓ рддрднреА рдЕрдкрдбреЗрдЯ рдХрд░реЗ рдЬрдм updated_at рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рдХреБрдЫ рдЧреЛрдЯchas рд╣реЛрддреЗ рд╣реИрдВред рдЕрд▓рдЧтАСрдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрд▓рдЧ рдкреНрд░рд┐рд╕рд┐рдЬрди рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рд╕реЗрдХрдВрдб рддрдХ рд░рд╛рдЙрдВрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рддреЗрдЬрд╝ рдПрдбрд┐рдЯ рдорд┐рд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рд╡рд╣реА DB рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓реЙрдХ рдбреНрд░рд┐рдлреНрдЯ рдФрд░ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рднреА рдЙрд▓рдЭрдиреЗрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рд╕рд░рд▓ рддреБрд▓рдирд╛:

  • Version рдХреЙрд▓рдо: рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ, рдбреЗрдЯрд╛рдмреЗрд╕-рд╕реНрд╡рддрдВрддреНрд░, рдХреНрд▓реЙрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВред
  • updated_at: рдЕрдХреНрд╕рд░ тАЬрдлреНрд░реАтАЭ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ, рдкрд░ рдкреНрд░рд┐рд╕рд┐рдЬрди рдФрд░ рдХреНрд▓реЙрдХ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рджрд┐рдХреНрдХрддреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП, version рдХреЙрд▓рдо рдкреНрд░рд╛рдердорд┐рдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ, рдкреВрд░реНрд╡рд╛рдиреБрдореЗрдп рдФрд░ рд▓реЙрдЧ/рд╕рдкреЛрд░реНрдЯ рдЯрд┐рдХрдЯреНрд╕ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЕрдЧрд░ рдЖрдк AppMaster рдореЗрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЖрдорддреМрд░ рдкрд░ Data Designer рдореЗрдВ integer version рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЕрдкрдбреЗрдЯ рд▓реЙрдЬрд┐рдХ рдЗрд╕реЗ рдЪреЗрдХ рдХрд░реЗред рдЖрдк auditing рдХреЗ рд▓рд┐рдП updated_at рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП version рдХреЛ рд╣реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред

рд╣рд░ рдПрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╕реНрдЯреЛрд░ рдФрд░ рдХреНрдпрд╛ рднреЗрдЬреЗрдВ

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рд░ рдПрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рдПрдХ "last seen" рдорд╛рд░реНрдХрд░ рдЬреБрдбрд╝рд╛ рд╣реЛ рдЬреЛ рддрдм рдХрд╛ рд╣реЛ рдЬрдм рдпреВрдЬрд░ рдиреЗ рдлреЙрд░реНрдо рдЦреЛрд▓рд╛ рдерд╛ред рд╡рд╣ рдорд╛рд░реНрдХрд░ version рдирдВрдмрд░ рдпрд╛ updated_at рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╕рд░реНрд╡рд░ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдмреАрдЪ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реБрдП рдереЗ рдпрд╛ рдирд╣реАрдВред

рд░рд┐рдХреЙрд░реНрдб рдкрд░, рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдмрд┐рдЬрдиреЗрд╕ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ concurrency рдлрд╝реАрд▓реНрдб рд░рдЦреЗрдВ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗред рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рджрд┐рдЦрддрд╛ рд╣реИ:

  • id (рд╕реНрдерд╛рдпреА рдкрд╣рдЪрд╛рди)
  • рдмрд┐рдЬрдиреЗрд╕ рдлрд╝реАрд▓реНрдбреНрд╕ (name, status, price, notes, рдЖрджрд┐)
  • version (рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рдЕрдкрдбреЗрдЯ рдкрд░ рдЗрдирдХреНрд░реАрдореЗрдВрдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ integer) рдпрд╛ updated_at (рд╕рд░реНрд╡рд░-рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк)

рдЬрдм рдПрдбрд┐рдЯ рд╕реНрдХреНрд░реАрди рд▓реЛрдб рд╣реЛ, рддреЛ рдлреЙрд░реНрдо рдХреЛ рдЙрд╕ concurrency рдлрд╝реАрд▓реНрдб рдХреА last-seen рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдПрдбрд┐рдЯ рди рдХрд░реЗрдВ тАФ рдЗрд╕реЗ hidden рдлрд╝реАрд▓реНрдб рдпрд╛ рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ рдореЗрдВ рд░рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг: API version: 12 рд▓реМрдЯрд╛рддреА рд╣реИ, рдФрд░ рдлреЙрд░реНрдо рдЙрд╕ 12 рдХреЛ рддрдм рддрдХ рд░рдЦреЗ рдЬрдм рддрдХ Save рди рд╣реЛред

рдЬрдм рдпреВрдЬрд░ Save рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗ, рддреЛ рджреЛ рдЪреАрдЬрд╝реЗрдВ рднреЗрдЬреЗрдВ: рдмрджрд▓рд╛рд╡ рдФрд░ last-seen рдорд╛рд░реНрдХрд░ред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдЕрдкрдбреЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдмреЙрдбреА рдореЗрдВ id, рдмрджрд▓реЗ рд╣реБрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдФрд░ expected_version (рдпрд╛ expected_updated_at) рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред AppMaster рдореЗрдВ UI рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрд╛рдЙрдВрдб рд╡реИрд▓реНрдпреВ рдХреА рддрд░рд╣ рдЯреНрд░реАрдЯ рдХрд░реЗрдВ: рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░реЗрдВ, рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦреЗрдВ, рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред

рд╕рд░реНрд╡рд░ рдкрд░, рдЕрдкрдбреЗрдЯ conditional рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдХреЗрд╡рд▓ рддрднреА рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЬрдм expected рдорд╛рд░реНрдХрд░ рд╡рд░реНрддрдорд╛рди DB рд╡реИрд▓реНрдпреВ рд╕реЗ рдореИрдЪ рдХрд░реЗред рдЕрдЧрд░ рдореИрдЪ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдЪреБрдкрдЪрд╛рдк рдорд░реНрдЬ рди рдХрд░реЗрдВред

рдПрдХ conflict response рд╕реНрдкрд╖реНрдЯ рдФрд░ UI рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ conflict response рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • HTTP status 409 Conflict
  • рдЫреЛрдЯрд╛ рд╕рдВрджреЗрд╢ рдЬреИрд╕реЗ тАЬThis record was updated by someone else.тАЭ
  • рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд╡реИрд▓реНрдпреВ (current_version рдпрд╛ current_updated_at)
  • рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд░рд┐рдХреЙрд░реНрдб (рддрд╛рдХрд┐ UI рджрд┐рдЦрд╛ рд╕рдХреЗ рдХреНрдпрд╛ рдмрджрд▓рд╛)

рдЙрджрд╛рд╣рд░рдг: рд╕рдо рдПрдХ Customer рд░рд┐рдХреЙрд░реНрдб version: 12 рдкрд░ рдЦреЛрд▓рддрд╛ рд╣реИред рдкреНрд░рд┐рдпрд╛ рдПрдХ рдмрджрд▓рд╛рд╡ рд╕реЗрд╡ рдХрд░рддреА рд╣реИ, рдЬреЛ рдЗрд╕реЗ version 13 рдмрдирд╛рддреА рд╣реИред рдмрд╛рдж рдореЗрдВ рд╕рдо Save рдХрд░рддрд╛ рд╣реИ with expected_version: 12ред рд╕рд░реНрд╡рд░ 409 рдХреЗ рд╕рд╛рде current record version 13 рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдм UI рд╕рдо рдХреЛ рдирд╡реАрдирддрдо рдорд╛рдиреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдмрдЬрд╛рдп рдкреНрд░рд┐рдпрд╛ рдХреЗ рдПрдбрд┐рдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗред

рдЪрд░рдг-рджрд░-рдЪрд░рдг: рдПрдВрдбтАСрдЯреВтАСрдПрдВрдб рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рд╡реЗрдм рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреВрд▓
рд╡реЗрдм рдФрд░ рдиреЗрдЯрд┐рд╡ рдореЛрдмрд╛рдЗрд▓ рдРрдк рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЯреАрдореЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд░рд╣реЗрдВред
рдЕрднреА рдЖрдЬрд╝рдорд╛рдПрдБ

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдореВрд▓рддрдГ рдПрдХ рдирд┐рдпрдо рдкрд░ рдЖрддрд╛ рд╣реИ: рд╣рд░ рдПрдбрд┐рдЯ рдХреЛ рдпрд╣ рд╕рд┐рджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдирд╡реАрдирддрдо рд╕реЗрд╡реНрдб рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

1) рдПрдХ concurrency рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ

рдПрдХ рдРрд╕рд╛ рдлрд╝реАрд▓реНрдб рдЪреБрдиреЗрдВ рдЬреЛ рд╣рд░ рд▓рд┐рдЦрдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рдПред

рдПрдХ рд╕рдорд░реНрдкрд┐рдд integer version рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред 1 рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╣рд░ рдЕрдкрдбреЗрдЯ рдкрд░ 1 рдмрдврд╝рд╛рдПрдБред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рднрд░реЛрд╕реЗрдордВрдж updated_at рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реИ рдЬреЛ рд╣рд░ рд▓рд┐рдЦрдиреЗ рдкрд░ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рдкреНрд░рддреНрдпреЗрдХ write (background jobs рд╕рд╣рд┐рдд) рдкрд░ рдЕрдкрдбреЗрдЯ рд╣реЛред

2) рдкрдврд╝рдиреЗ рдкрд░ рд╡рд╣ рдорд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬреЗрдВ

рдЬрдм UI рдПрдбрд┐рдЯ рд╕реНрдХреНрд░реАрди рдЦреЛрд▓рддреА рд╣реИ, рддреЛ response рдореЗрдВ рд╡рд░реНрддрдорд╛рди version (рдпрд╛ updated_at) рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдЗрд╕реЗ рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ рдореЗрдВ hidden рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВред

рдЗрд╕реЗ рдПрдХ рд░рд┐рд╕реАрдЯ рдХреА рддрд░рд╣ рд╕реЛрдЪреЗрдВ рдЬреЛ рдХрд╣рддреА рд╣реИ: тАЬрдореИрдВ рд╡рд╣реА рдПрдбрд┐рдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬреЛ рдореИрдВрдиреЗ рдЖрдЦрд╝рд┐рд░реА рдмрд╛рд░ рдкрдврд╝рд╛ рдерд╛редтАЭ

3) рдЕрдкрдбреЗрдЯ рдкрд░ рд╡рд╣ рд╡реИрд▓реНрдпреВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░реЗрдВ

рд╕реЗрд╡ рдкрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдмрджрд▓реЗ рд╣реБрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдФрд░ last-seen concurrency рд╡реИрд▓реНрдпреВ рджреЛрдиреЛрдВ рднреЗрдЬреЗред

рд╕рд░реНрд╡рд░ рдкрд░, рдЕрдкрдбреЗрдЯ conditional рд░рдЦреЗрдВред SQL рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ:

UPDATE tickets
SET status = $1,
    version = version + 1
WHERE id = $2
  AND version = $3;

рдпрджрд┐ рдЕрдкрдбреЗрдЯ 1 row рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕реЗрд╡ рд╕рдлрд▓ рд░рд╣реАред рдпрджрд┐ 0 rows рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

4) рд╕рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рдирдпрд╛ рдорд╛рди рд▓реМрдЯрд╛рдПрдБ

рд╕рдлрд▓ рд╕реЗрд╡ рдХреЗ рдмрд╛рдж, рдЕрдкрдбреЗрдЯреЗрдб рд░рд┐рдХреЙрд░реНрдб рдирдпрд╛ version (рдпрд╛ рдирдпрд╛ updated_at) рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдПрдБред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ рдЙрд╕реА рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреБрд░рд╛рдиреЗ version рд╕реЗ рджреЛрдмрд╛рд░рд╛ рд╕реЗрд╡ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

5) рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЗрдВ

рдЬрдм conditional update рдлреЗрд▓ рдХрд░реЗ, рддреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ conflict response рд▓реМрдЯрд╛рдПрдБ (рдЕрдХреНрд╕рд░ HTTP 409) рдЬреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗ:

  • рдЕрдм рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ current рд╕рд░реНрд╡рд░ рд░рд┐рдХреЙрд░реНрдб
  • рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди (рдпрд╛ рдЗрддрдирд╛ рдХрд┐ UI рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрдорд┐рдд рдХрд░ рд╕рдХреЗ)
  • рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рдЕрд▓рдЧ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдпрд╣ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

AppMaster рдореЗрдВ, рдпрд╣ PostgreSQL рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб, рдПрдХ рд░реАрдб рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬреЛ version рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ Business Process рдЬреЛ conditional update рдХрд░рддрд╛ рд╣реИ рдФрд░ success рдпрд╛ conflict рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдмреНрд░рд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдлрд╝рд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

рдпреВрдЖрдИ рдкреИрдЯрд░реНрди рдЬреЛ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╖реНрдЯрдкреНрд░рдж рдирд╣реАрдВ рдмрдирд╛рддреЗ

рдЬрд░реВрд░реА рдХрдиреЗрдХреНрд╢рди рдЬрд▓реНрджреА рдЬреЛрдбрд╝реЗрдВ
рдЬрдм рдЖрдкрдХрд╛ рдПрдбрдорд┐рди рдЯреВрд▓ рдмрдврд╝реЗ рддреЛ authentication рдФрд░ Stripe рдЬреИрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВред
рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВ

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдЖрдзрд╛ рдХрд╛рдо рд╣реИред рджреВрд╕рд░рд╛ рдЖрдзрд╛ рд╡рд╣ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрддрд╛ рд╣реИ рдЬрдм рдЙрдирдХреА рд╕реЗрд╡ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг reject рд╣реЛрддреА рд╣реИред

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

рдкреИрдЯрд░реНрди 1: рд╕рд╛рдзрд╛рд░рдг blocking рдбрд╛рдпрд▓реЙрдЧ (рд╕рдмрд╕реЗ рддреЗрдЬрд╝)

рдЬрдм рдПрдбрд┐рдЯ рдЫреЛрдЯреЗ рд╣реЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ reload рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдирд╛ рдмрджрд▓рд╛рд╡ рдлрд┐рд░ рд╕реЗ рд▓рдЧрд╛ рд╕рдХреЗрдВ рддреЛ рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред

рд╕рдВрджреЗрд╢ рдЫреЛрдЯрд╛ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рдЦреЗрдВ: тАЬрдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдЖрдкрдХреЗ рдПрдбрд┐рдЯ рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдирд╡реАрдирддрдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП reload рдХрд░реЗрдВредтАЭ рдлрд┐рд░ рджреЛ рд╕рд╛рдл рдХреНрд░рд┐рдпрд╛рдПрдБ рджреЗрдВ:

  • Reload and continue (primary)
  • Copy my changes (рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд░ рдЙрдкрдпреЛрдЧреА)

тАЬCopy my changesтАЭ unsaved рдорд╛рдиреЛрдВ рдХреЛ clipboard рдкрд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ reload рдХреЗ рдмрд╛рдж рдлреЙрд░реНрдо рдореЗрдВ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓реЛрдЧ рдЬреЛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЙрд╕реЗ рдпрд╛рдж рди рд░рдЦреЗрдВред

рдпрд╣ рд╕рд┐рдВрдЧрд▓тАСрдлреАрд▓реНрдб рдЕрдкрдбреЗрдЯреНрд╕, рдЯреЙрдЧрд▓реНрд╕, рд╕реНрдЯреЗрдЯрд╕ рдЪреЗрдВрдЬ рдпрд╛ рдЫреЛрдЯреЗ рдиреЛрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд┐рд▓реНрдбрд░реЛрдВ (AppMaster рд╕рд╣рд┐рдд) рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИред

рдкреИрдЯрд░реНрди 2: тАЬReview changesтАЭ (рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛)

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

  • тАЬYour editsтАЭ (рдЖрдкрдиреЗ рдЬреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА)
  • тАЬCurrent valuesтАЭ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╡реАрдирддрдо)
  • тАЬWhat changed since you opened itтАЭ (рд╕рд┐рд░реНрдлрд╝ conflicting рдлрд╝реАрд▓реНрдбреНрд╕)

рдлреЛрдХрд╕реНрдб рд░рдЦреЗрдВ тАФ рдЕрдЧрд░ рд╕рд┐рд░реНрдл рддреАрди рдлрд╝реАрд▓реНрдб рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдореЗрдВ рд╣реИрдВ рддреЛ рд╣рд░ рдлрд╝реАрд▓реНрдб рди рджрд┐рдЦрд╛рдПрдБред

рдкреНрд░рддреНрдпреЗрдХ conflicting рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рджреЗрдВ:

  • рдореЗрд░реА рд╡рд╛рд▓реА рд░рдЦреЗрдВ
  • рдЙрдирдХреА рд╡рд╛рд▓реА рд▓реЗрдВ
  • рдорд░реНрдЬ рдХрд░реЗрдВ (рдЬрдм рд╕рдордЭ рдореЗрдВ рдЖрдП, рдЬреИрд╕реЗ рдЯреИрдЧреНрд╕ рдпрд╛ рдиреЛрдЯреНрд╕)

рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рд░реЗрд╢реЛрд▓реНрд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдмрд╕реЗ рдирд╡реАрдирддрдо рд╡рд░реНрд╢рди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд╕реЗрд╡ рдХрд░реЗрдВред рд░рд┐рдЪ рдЯреЗрдХреНрд╕реНрдЯ рдпрд╛ рд▓рдВрдмреЗ рдиреЛрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ diff рджрд┐рдЦрд╛рдПрдБ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд▓реНрджреА рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХреЗрдВред

рдХрдм рдлреЛрд░реНрд╕реНрдб рдУрд╡рд░рд░рд╛рдЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рдФрд░ рдХрд┐рд╕реЗ)

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

рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлреЙрд▓реНрдЯ тАЬReview changesтАЭ рд░рдЦреЗрдВред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдХреЙрд░реНрдб рдорд╛рд▓рд┐рдХ рд╣реЛ, рд░рд┐рдХреЙрд░реНрдб рдХрдотАСрдЬреЛрдЦрд┐рдо рд╡рд╛рд▓рд╛ рд╣реЛ, рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рдЦрд░рд╛рдм рдбреЗрдЯрд╛ рд╕рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реЛ рддрдм рд╣реА рдлреЛрд░реНрд╕реНрдб рдУрд╡рд░рд░рд╛рдЗрдЯ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрддрд╛ рд╣реИред

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

рджреЛ рд╕рдкреЛрд░реНрдЯ рдПрдЬреЗрдВрдЯ, Maya рдФрд░ Jordan, рдПрдХ рд╣реА рдЧреНрд░рд╛рд╣рдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдЕрд▓рдЧ рдХреЙрд▓реНрд╕ рдХреЗ рдмрд╛рдж рд╕реНрдЯреЗрдЯрд╕ рдФрд░ рдиреЛрдЯреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЯрд╛рдЗрдорд▓рд╛рдЗрди (рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рд╕рдХреНрд╖рдо, version рдпрд╛ updated_at рдЪреЗрдХ рдХреЗ рд╕рд╛рде):

  • 10:02 - Maya Customer #4821 рдЦреЛрд▓рддреА рд╣реИред рдлреЙрд░реНрдо рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ Status = "Needs follow-up", Notes = "Called yesterday" рдФрд░ Version = 7.
  • 10:03 - Jordan рднреА рд╡рд╣реА рд░рд┐рдХреЙрд░реНрдб рдЦреЛрд▓рддрд╛ рд╣реИ; рдЙрд╕реЗ рднреА Version = 7 рджрд┐рдЦрддрд╛ рд╣реИред
  • 10:05 - Maya Status рдХреЛ "Resolved" рдХрд░рддреА рд╣реИ рдФрд░ рдиреЛрдЯ рдЬреЛрдбрд╝рддреА рд╣реИ: "Issue fixed, confirmed by customer." рд╡рд╣ Save рдХрд░рддреА рд╣реИред
  • 10:05 - рд╕рд░реНрд╡рд░ рд░рд┐рдХреЙрд░реНрдб рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, Version рдХреЛ 8 рдХрд░ рджреЗрддрд╛ рд╣реИ (рдпрд╛ updated_at рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ), рдФрд░ audit entry рдмрдирд╛рддрд╛ рд╣реИ: рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдФрд░ рдХрдм рдмрджрд▓рд╛ред
  • 10:09 - Jordan рдЕрд▓рдЧ рдиреЛрдЯ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ: "Customer asked for a receipt" рдФрд░ Save рдХрд░рддрд╛ рд╣реИред

рдмрд┐рдирд╛ concurrency рдЪреЗрдХ рдХреЗ, Jordan рдХреА рд╕реЗрд╡ Maya рдХреЗ рд╕реНрдЯреЗрдЯрд╕ рдФрд░ рдиреЛрдЯ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддреА рдереАред рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рд╕реЗ рд╕рд░реНрд╡рд░ Jordan рдХреА рдЕрдкрдбреЗрдЯ рдХреЛ reject рдХрд░ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ Version = 7 рдХреЗ рд╕рд╛рде рд╕реЗрд╡ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрдмрдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдЕрдм Version = 8 рдкрд░ рд╣реИред

Jordan рдХреЛ рдПрдХ рд╕рд╛рдлрд╝ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╕рдВрджреЗрд╢ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ UI рдЙрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдЧрд▓рд╛ рдХрджрдо рджреЗрддрд╛ рд╣реИ:

  • рдирд╡реАрдирддрдо рд░рд┐рдХреЙрд░реНрдб reload рдХрд░реЗрдВ (рдореЗрд░реЗ рдПрдбрд┐рдЯреНрд╕ рдЫреЛрдбрд╝ рджреЗрдВ)
  • рдореЗрд░реА рдмрджрд▓реЗрдВ рдирд╡реАрдирддрдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ)
  • рдЕрдВрддрд░ рджреЗрдЦреЗрдВ ("Mine" vs "Latest") рдФрд░ рдЪреБрдиреЗрдВ рдХреНрдпрд╛ рд░рдЦреЗрдВ

рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛ рд╕рдХрддреА рд╣реИ:

  • тАЬрдпрд╣ рдЧреНрд░рд╛рд╣рдХ Maya рдиреЗ 10:05 рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛тАЭ
  • рдЬрд┐рди рдлрд╝реАрд▓реНрдбреНрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реБрдЖ рдЙрдиреНрд╣реЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдВ (Status рдФрд░ Notes)
  • Jordan рдХреЗ unsaved рдиреЛрдЯ рдХрд╛ preview рджрд┐рдЦрд╛рдПрдБ рддрд╛рдХрд┐ рд╡рд╣ рдЙрд╕реЗ рдХреЙрдкреА рдпрд╛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗ

Jordan тАЬReview differencesтАЭ рдЪреБрдирддрд╛ рд╣реИ, Maya рдХрд╛ Status = "Resolved" рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЕрдкрдирд╛ рдиреЛрдЯ рдореМрдЬреВрджрд╛ рдиреЛрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд╡рд╣ рдлрд┐рд░ рд╕реЗ Save рдХрд░рддрд╛ рд╣реИ, рдЕрдм Version = 8 рдХреЗ рд╕рд╛рде, рдФрд░ рдЕрдкрдбреЗрдЯ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдм Version = 9)ред

рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐: рдХреЛрдИ рдбреЗрдЯрд╛ рд▓реЙрд╕ рдирд╣реАрдВ, рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд▓рдЧрдирд╛ рдХрд┐ рдХрд┐рд╕рдиреЗ рдХрд┐рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рд╕рд╛рдл audit trail рдЬреЛ Maya рдХреЗ рд╕реНрдЯреЗрдЯрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рджреЛрдиреЛрдВ рдиреЛрдЯреНрд╕ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддрд╛ рд╣реИред AppMaster рдореЗрдВ рдпрд╣ рдПрдХ conditional update рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ conflict-resolution рдбрд╛рдпрд▓реЙрдЧ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдореИрдк рд╣реЛрддрд╛ рд╣реИред

рдЖрдо рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдЕрднреА рднреА рдбреЗрдЯрд╛ рд▓реЙрд╕ рдХрд░рд╛рддреА рд╣реИрдВ

рдбреЗрдЯрд╛ рдПрдбрд┐рдЯреНрд╕ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рдПрдВ
рдХрдИ рдПрдбрд┐рдЯрд░реНрд╕ рдФрд░ рд╡реНрдпрд╕реНрдд рдХрддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЗрди-рд╣рд╛рдЙрд╕ рдЯреВрд▓ рдмрдирд╛рдПрдВред
AppMaster рдореЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВ

рдЬрд╝реНрдпрд╛рджрд╛рддрд░ "рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ" рдмрдЧреНрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддреЗ; рд╡реЗ UI, API рдФрд░ DB рдХреЗ рдмреАрдЪ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ рд▓реЗрдпрд░ рдиреЗ рдирд┐рдпрдо рднреВрд▓ рдЧрдпрд╛, рддреЛ рдлрд┐рд░ рднреА рд╕рд╛рдЗрд▓реЗрдВрдЯ рдУрд╡рд░рд░рд╛рдЗрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЧрд▓рддреА рдпрд╣ рд╣реИ рдХрд┐ рдПрдбрд┐рдЯ рд╕реНрдХреНрд░реАрди рд▓реЛрдб рдХрд░рддреЗ рд╡рдХреНрдд version (рдпрд╛ timestamp) рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░ рд╕реЗрд╡ рдкрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ред рдпрд╣ рдЕрдХреНрд╕рд░ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдлреЙрд░реНрдо рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ reuse рд╣реЛрддрд╛ рд╣реИ рдФрд░ hidden рдлрд╝реАрд▓реНрдб рдЫреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм API рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗрд╡рд▓ тАЬchangedтАЭ рдлрд╝реАрд▓реНрдбреНрд╕ рднреЗрдЬрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдЬрд╛рд▓ рдХреЗрд╡рд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪреЗрдХ рдХрд░рдирд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрддреА рд╣реИ, рдкрд░ рдЕрдЧрд░ рд╕рд░реНрд╡рд░ рдЕрдкрдбреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рджреВрд╕рд░рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ (рдпрд╛ retry) рдбреЗрдЯрд╛ рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдВрддрд┐рдо рдЧреЗрдЯрдХреАрдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ data-loss рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди:

  • рд╕реЗрд╡ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ concurrency token рдирд╣реАрдВ рднреЗрдЬрдирд╛ (version, updated_at, рдпрд╛ ETag) тАФ рд╕рд░реНрд╡рд░ рдХреЗ рдкрд╛рд╕ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ред
  • рдХреЗрд╡рд▓ id рд╕реЗ рдЕрдкрдбреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдмрдЬрд╛рдп тАЬid + versionтАЭ рдХреЗ рдПрдЯреЙрдорд┐рдХ рдХрдВрдбреАрд╢рди рдХреЗред
  • рд╕реЗрдХрдВрдбтАСрд▓реЗрд╡рд▓ рдкрд░ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП updated_at рдЬреИрд╕реА рдХрдо рдкреНрд░рд┐рд╕рд┐рдЬрди рд╡рд╛рд▓реА timestamps рдХрд╛ рдЙрдкрдпреЛрдЧред
  • рдмрдбрд╝реЗ рдлрд╝реАрд▓реНрдбреНрд╕ (notes, descriptions) рдпрд╛ рдкреВрд░реЗ рдРрд░реЗ (tags, line items) рдХреЛ рдмрд┐рдирд╛ рдпрд╣ рджрд┐рдЦрд╛рдП рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓рд╛ тАФ рдЗрд╕рд╕реЗ рджреВрд╕рд░реЛрдВ рдХреЗ рдмрджрд▓рд╛рд╡ рдорд┐рдЯ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХрд┐рд╕реА рднреА рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдХреЛ рд╕рд┐рд░реНрдлрд╝ тАЬрдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЛтАЭ рдорд╛рди рд▓реЗрдирд╛, рдЬреЛ stale рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЛ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг: рджреЛ рд╕рдкреЛрд░реНрдЯ рд▓реАрдб рдПрдХ рд╣реА рдЧреНрд░рд╛рд╣рдХ рд░рд┐рдХреЙрд░реНрдб рдЦреЛрд▓рддреЗ рд╣реИрдВред рдПрдХ рд▓рдВрдмрд╛ рдЗрдВрдЯрд░рдирд▓ рдиреЛрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╕реНрдЯреЗрдЯрд╕ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХрд╛ рд╕реЗрд╡ рдкреВрд░рд╛ рд░рд┐рдХреЙрд░реНрдб payload рд╕реЗ рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреЗрдЯрд╕ рдмрджрд▓рд╛рд╡ рдиреЛрдЯ рдХреЛ рдорд┐рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЯреАрдореЗрдВ рддрдм рднреА рдбреЗрдЯрд╛ рдЦреЛ рджреЗрддреА рд╣реИрдВ рдЕрдЧрд░ API response рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╕рд┐рд░реНрдлрд╝ "409 Conflict" рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд▓реМрдЯрд╛рдПрдБ:

  • current server version (рдпрд╛ updated_at)
  • рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдирд╡реАрдирддрдо рд╕рд░реНрд╡рд░ рдорд╛рди
  • рд╡реЗ рдлрд╝реАрд▓реНрдб рдЬрд┐рдирдореЗрдВ рдлрд░реНрдХ рд╣реИ (рд╕рд░рд▓ рдирд╛рдо рднреА рдареАрдХ рд╣реИ)
  • рдХрд┐рд╕рдиреЗ рдФрд░ рдХрдм рдмрджрд▓рд╛ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ)

AppMaster рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣реА рдЕрдиреБрд╢рд╛рд╕рди рдЕрдкрдирд╛рдПрдБ: UI рд╕реНрдЯреЗрдЯ рдореЗрдВ version рд░рдЦреЗрдВ, update рдХреЗ рд╕рд╛рде рднреЗрдЬреЗрдВ, рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗSQL рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреИрдХрдПрдВрдб рд▓реЙрдЬрд┐рдХ рдореЗрдВ рдЪреЗрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рд╢рд┐рдк рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд╡рд░рд┐рдд рдЪреЗрдХ

рдПрдХ рд╕рд╛рдЭрд╛ рдПрдбрдорд┐рди рдкреИрдирд▓ рдмрдирд╛рдПрдВ
PostgreSQL рдореЙрдбрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рдмрд┐рдирд╛ Go рд▓рд┐рдЦреЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдмреИрдХрдПрдВрдб рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред
рдРрдк рдмрдирд╛рдПрдВ

рд░реЛрд▓рдЖрдЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЙрди failure modes рдХреА рдПрдХ рдЫреЛрдЯреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬреЛ тАЬрдЗрд╕реЗ рдареАрдХ рд╕реЗ рд╕реЗрд╡ рдХрд░ рджрд┐рдпрд╛тАЭ рдЬреИрд╕рд╛ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХрд╛рдо рдХреЛ рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдбреЗрдЯрд╛ рдФрд░ API рдЪреЗрдХ

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб end-to-end рдПрдХ concurrency token рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ тАФ рд╡рд╣ version integer рд╣реЛ рдпрд╛ updated_at timestamp, рдкрд░ рдЙрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдиреЗрдВ, рди рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдореЗрдЯрд╛рдбрд╛рдЯрд╛ред

  • Reads рдореЗрдВ рдЯреЛрдХрди рд╢рд╛рдорд┐рд▓ рд╣реЛ рдФрд░ UI рдЙрд╕реЗ рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗ (рд╕рд┐рд░реНрдл рд╕реНрдХреНрд░реАрди рдкрд░ рди)ред
  • рд╣рд░ рдЕрдкрдбреЗрдЯ last-seen рдЯреЛрдХрди рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рд╕рдлрд▓рддрд╛ рдкрд░ рд╕рд░реНрд╡рд░ рдирдпрд╛ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ UI sync рдореЗрдВ рд░рд╣реЗред
  • bulk edits рдФрд░ inline edits рднреА рд╡рд╣реА рдирд┐рдпрдо рдЕрдкрдирд╛рдПрдБ, рдХреЛрдИ рд╢реЙрд░реНрдЯрдХрдЯ рди рдмрдирд╛рдПрдВред
  • рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдм рдЬреЛ рдЙрдиреНрд╣реАрдВ rows рдХреЛ рдПрдбрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рднреА рдЪреЗрдХ рдХрд░реЗрдВ (рдирд╣реАрдВ рддреЛ рдЙрдирдХреЗ рдХрд╛рд░рдг рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╣реЛрдВрдЧреЗ)ред

AppMaster рдореЗрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ Data Designer рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореМрдЬреВрдж рд╣реИ (version рдпрд╛ updated_at), рдФрд░ Business Process update рдлреНрд▓реЛ рдореЗрдВ рдЙрд╕реЗ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рд░рдЦреЗрдВред

UI рдЪреЗрдХ

рдПрдХ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рддрдм рд╣реА тАЬрд╕реБрд░рдХреНрд╖рд┐рддтАЭ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЕрдЧрд▓рд╛ рдХрджрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛред

рдЬрдм рд╕рд░реНрд╡рд░ рдЕрдкрдбреЗрдЯ reject рдХрд░реЗ рддреЛ рдПрдХ рд╕рд╛рдл рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдБ: тАЬрдпрд╣ рд░рд┐рдХреЙрд░реНрдб рддрдм рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рдЬрдм рдЖрдкрдиреЗ рдЗрд╕реЗ рдЦреЛрд▓рд╛ рдерд╛редтАЭ рдлрд┐рд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд╣рд▓реЗ рджреЗрдВ: рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ reload рдХрд░реЗрдВред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ тАЬreload and reapplyтАЭ рдкрд╛рде рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ unsaved рдЗрдирдкреБрдЯ рдХреЛ рд░рдЦреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддрд╛рдЬрд╝рд╛ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рджреЛрдмрд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд░реЗ, рддрд╛рдХрд┐ рдЫреЛрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдлрд┐рд░ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рди рдкрдбрд╝реЗред

рдпрджрд┐ рдЯреАрдо рдХреЛ рд╕рдЪ рдореЗрдВ рдЬрд╝рд░реВрд░реА рд╣реЛ рддреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд тАЬforce saveтАЭ рд╡рд┐рдХрд▓реНрдк рджреЗрдВред рдЗрд╕реЗ рд░реЛрд▓ рд╕реЗ рдЧреЗрдЯ рдХрд░реЗрдВ, рдХрдиреНрдлрд░реНрдо рдХрд░рд╛рдПрдБ, рдФрд░ рд▓реЙрдЧ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕рдиреЗ рдлреЛрд░реНрд╕ рдХрд┐рдпрд╛ рдФрд░ рдХреНрдпрд╛ рдмрджрд▓рд╛ред рдЗрд╕рд╕реЗ рдЖрдк рдЗрдорд░рдЬреЗрдВрд╕реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд▓реЙрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдПред

рдЕрдЧрд▓реЗ рдХрджрдо: рдПрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкрд░ рд▓реЙрдХрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ

рдЫреЛрдЯреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред рдХрд┐рд╕реА рдПрдХ рдПрдбрдорд┐рди рд╕реНрдХреНрд░реАрди рдХреЛ рдЪреБрдиреЗрдВ рдЬрд╣рд╛рдБ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдПрдХтАСрджреВрд╕рд░реЗ рд╕реЗ рдЯрдХрд░рд╛рддреЗ рд╣реЛрдВ, рдФрд░ рдкрд╣рд▓реЗ рд╡рд╣реАрдБ optimistic locking рдЬреЛрдбрд╝реЗрдВред рд╣рд╛рдИтАСрдХреЛрд▓рд┐рд╢рди рдХреНрд╖реЗрддреНрд░ рдЖрдорддреМрд░ рдкрд░ рдЯрд┐рдХрдЯреНрд╕, рдСрд░реНрдбрд░реНрд╕, рдкреНрд░рд╛рдЗрд╕рд┐рдВрдЧ рдФрд░ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рд╡реНрдпрд╕реНрдд рд╕реНрдХреНрд░реАрди рдкрд░ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдкреИрдЯрд░реНрди рдХреЛ рдмрд╛рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд▓реНрджреА рджреЛрд╣рд░рд╛ рдкрд╛рдПрдБрдЧреЗред

рдкрд╣рд▓реЗ рд╕реЗ рдЕрдкрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреИрдХрдПрдВрдб рд▓реЙрдЬрд┐рдХ рдФрд░ UI рджреЛрдиреЛрдВ рдХреЛ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИ:

  • Block-and-reload: рд╕реЗрд╡ рд░реЛрдХреЗрдВ, рдирд╡реАрдирддрдо рд░рд┐рдХреЙрд░реНрдб reload рдХрд░реЗрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЛ рдХрд╣реЗрдВред
  • Review-and-merge: тАЬрдЖрдкрдХреЗ рдмрджрд▓рд╛рд╡тАЭ рдмрдирд╛рдо тАЬрдирд╡реАрдирддрдо рдмрджрд▓рд╛рд╡тАЭ рджрд┐рдЦрд╛рдПрдБ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрдп рдХрд░реЗ рдХреНрдпрд╛ рд░рдЦрдирд╛ рд╣реИред

Block-and-reload рдЬрд▓реНрджреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реИ рдФрд░ рдЫреЛрдЯреЗ рдПрдбрд┐рдЯреНрд╕ (рд╕реНрдЯреЗрдЯрд╕, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдЫреЛрдЯреЗ рдиреЛрдЯреНрд╕) рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Review-and-merge рд▓рдВрдмреА рдпрд╛ рд╣рд╛рдИтАСрд╕реНрдЯреЗрдХ рд░рд┐рдХреЙрд░реНрдбреНрд╕ (рдкреНрд░рд╛рдЗрд╕рд┐рдВрдЧ рдЯреЗрдмрд▓реНрд╕, рдорд▓реНрдЯрд┐тАСрдлреАрд▓реНрдб рдСрд░реНрдбрд░ рдПрдбрд┐рдЯреНрд╕) рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред

рдлрд┐рд░ рдПрдХ рдкреВрд░рд╛ рдлреНрд▓реЛ рдЯреЗрд╕реНрдЯ рдХрд░рдХреЗ рд╣реА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ:

  • рдПрдХ рд╕реНрдХреНрд░реАрди рдЪреБрдиреЗрдВ рдФрд░ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕реВрдЪреА рдмрдирд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдмрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдмрджрд▓рддреЗ рд╣реИрдВред
  • рдлреЙрд░реНрдо рдкреЗрд▓реЛрдб рдореЗрдВ version (рдпрд╛ updated_at) рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕реЗрд╡ рдкрд░ рдЙрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░реЗрдВред
  • DB write рдореЗрдВ conditional update рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рд╕рд┐рд░реНрдл рддрдм рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЬрдм version рдореИрдЪ рдХрд░реЗ)ред
  • рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╕рдВрджреЗрд╢ рдФрд░ рдЕрдЧрд▓рд╛ рдХрджрдо рдбрд┐рдЬрд╛рдЗрди рдХрд░реЗрдВ (reload, copy рдореЗрд░рд╛ рдЯреЗрдХреНрд╕реНрдЯ, compare view)ред
  • рджреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рд╕реЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ: рдЯреИрдм A рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ, рдлрд┐рд░ рдЯреИрдм B рдореЗрдВ stale рдбреЗрдЯрд╛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд▓реНрдХрд╛тАСрдлреБрд▓реНрдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВред рдПрдХ рд╕рд░рд▓ тАЬconflict рд╣реБрдЖтАЭ рдЗрд╡реЗрдВрдЯ рдЬрд┐рд╕рдореЗрдВ record рдкреНрд░рдХрд╛рд░, рд╕реНрдХреНрд░реАрди рдирд╛рдо рдФрд░ user role рд╣реЛ, рдпрд╣ рдЖрдкрдХреЛ hotpots рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк AppMaster (appmaster.io) рд╕реЗ рдПрдбрдорд┐рди рдЯреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕реЗ рд╕рд╛рдл рддрд░рд╣ рд╕реЗ рдореИрдк рд╣реЛрддреЗ рд╣реИрдВ: Data Designer рдореЗрдВ version рдлрд╝реАрд▓реНрдб рдореЙрдбрд▓ рдХрд░реЗрдВ, Business Processes рдореЗрдВ conditional updates рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ UI рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ conflict рдбрд╛рдпрд▓реЙрдЧ рдЬреЛрдбрд╝реЗрдВред рдПрдХ рдмрд╛рд░ рдкрд╣рд▓рд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП, рд╡рд╣реА рдкреИрдЯрд░реНрди рд╕реНрдХреНрд░реАрди рджрд░ рд╕реНрдХреНрд░реАрди рджреЛрд╣рд░рд╛рдПрдБ рдФрд░ conflict UI рдХреЛ рд╕реНрдерд┐рд░ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рд╕реАрдЦрдХрд░ рд╣рд░ рдЬрдЧрд╣ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХреЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди

тАЬSilent overwriteтАЭ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?

рдПрдХ silent overwrite рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рджреЛ рд▓реЛрдЧ рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреИрдмреНрд╕/рд╕реЗрд╢рдиреНрд╕ рд╕реЗ рдПрдбрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЦрд╝рд┐рд░реА рд╕реЗрд╡ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЬреЛрдЦрд┐рдо рдпрд╣ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ тАЬрд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реЗрд╡тАЭ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧрд╛рдпрдм рдмрджрд▓рд╛рд╡ рдмрд╛рдж рдореЗрдВ рд╣реА рджрд┐рдЦрддреЗ рд╣реИрдВред

рд╕рд╛рдзрд╛рд░рдг рд╢рдмреНрджреЛрдВ рдореЗрдВ optimistic locking рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдРрдк рдЖрдкрдХреА рдмрджрд▓реЗрдВ рддрднреА рд╕реЗрд╡ рдХрд░реЗрдЧрд╛ рдЬрдм рд░рд┐рдХреЙрд░реНрдб рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рдЬреИрд╕реА рдЖрдк рдиреЗ рдЙрд╕реЗ рдЦреЛрд▓рд╛ рдерд╛ред рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗрд╡ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреА рд╕реЗрд╡ conflict рдХреЗ рд╕рд╛рде reject рд╣реЛ рдЬрд╛рдПрдЧреА рддрд╛рдХрд┐ рдЖрдк рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рджреЗрдЦрдХрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХреЗрдВред

рдХреНрдпреЛрдВ рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓реЙрдХ рдирд╣реАрдВ рдХрд░ рджреЗрддреЗ рддрд╛рдХрд┐ рдХреЛрдИ рдФрд░ рдПрдбрд┐рдЯ рди рдХрд░ рд╕рдХреЗ?

рдкреЗрд╕рд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдЙрд╕ рддрд░рд╣ рдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдбрд┐рдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ тАФ рдЗрд╕рд╕реЗ рд▓реЛрдЧ рд░реВрдХреЗ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ тАЬрдХрд┐рд╕рдиреЗ рд▓реЙрдХ рдХрд┐рдпрд╛?тАЭ рдЬреИрд╕реЗ рдорд╕рд▓реЗ рдЖрддреЗ рд╣реИрдВред рдПрдбрдорд┐рди рдкреИрдирд▓ рдореЗрдВ рдЕрдХреНрд╕рд░ рд▓реЛрдЧ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП optimistic locking рдЬрд╝реНрдпрд╛рджрд╛ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЯрдХрд░рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИред

рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ version рдирдВрдмрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ `updated_at`?

рдЖрдорддреМрд░ рдкрд░ version рдХреЙрд▓рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рднрд░реЛрд╕реЗрдордВрдж рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреНрд░рд┐рд╕рд┐рдЬрди рдпрд╛ рдХреНрд▓реЙрдХ рдбреНрд░рд┐рдлреНрдЯ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдБ рдирд╣реАрдВ рдЖрддреАрдВред updated_at рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрдо рдкреНрд░рд┐рд╕рд┐рдЬрди рд╡рд╛рд▓рд╛ рд╣реЛ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓реЙрдХреНрд╕ рдЕрд╕рдВрдЧрдд рд╣реЛрдВ рддреЛ рддреЗрдЬрд╝ рдПрдбрд┐рдЯ рдорд┐рд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░-рдХрдВрдЯреНрд░реЛрд▓реНрдб concurrency token рдЪрд╛рд╣рд┐рдП, рдЖрдорддреМрд░ рдкрд░ version (integer) рдпрд╛ updated_at (timestamp)ред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлреЙрд░реНрдо рдЦреЛрд▓рддреЗ рд╡рдХреНрдд рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдбрд┐рдЯ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реЗрд╡ рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ тАЬexpectedтАЭ рд╡реИрд▓реНрдпреВред

рдХреНрдпреЛрдВ рд╡рд░реНрд╢рди рдЪреЗрдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд┐рд░реНрдл UI рдкрд░ рдирд╣реАрдВ?

рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЪреЗрдХ рднрд░реЛрд╕реЗрдордВрдж рдирд╣реАрдВ рд╣реЛрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ/рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдм рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЛ рд╣реА conditional update рдЬреИрд╕реЗ тАЬUPDATE ... WHERE id = ? AND version = ?тАЭ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо рдЧреЗрдЯрдХреАрдкрд░ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдПрдХ рдЕрдЪреНрдЫрд╛ default рд╣реИ рдПрдХ blocking рд╕рдВрджреЗрд╢: тАЬрдпрд╣ рд░рд┐рдХреЙрд░реНрдб рддрдм рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рдЬрдм рдЖрдкрдиреЗ рдЗрд╕реЗ рдЦреЛрд▓рд╛ рдерд╛редтАЭ рдФрд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдЧрд▓рд╛ рдХрджрдо рджреЗрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ reload рдХрд░реЗрдВред рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓рдВрдмрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЙрдирдХрд╛ unsaved рдЗрдирдкреБрдЯ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рд╡реЗ reload рдХреЗ рдмрд╛рдж рдЙрд╕реЗ рджреБрдмрд╛рд░рд╛ рди рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдкрд░ API рдХреЛ UI рдореЗрдВ рд░рд┐рдХрд╡рд░реА рдорджрдж рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХрд┐рд╕реА рдХрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдкрд░ API рдЕрдХреНрд╕рд░ 409 рд▓реМрдЯрд╛рддреА рд╣реИ; рд╕рд╛рде рдореЗрдВ рдЗрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ рдХрд┐ UI рд░рд┐рдХрд╡рд░ рдХрд░ рд╕рдХреЗ: current server version (current_version/current_updated_at) рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдирд╡реАрдирддрдо рдорд╛рдиред рдЕрдЧрд░ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдпрд╣ рднреА рдмрддрд╛рдПрдВ рдХрд┐ рдХрд┐рд╕рдиреЗ рдФрд░ рдХрдм рдмрджрд▓рд╛ред

рдбреЗрдЯрд╛ рд▓реЙрд╕ рдХреЗ рд╕рдмрд╕реЗ рдЖрдо рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИрдВ?

рд╕рдмрд╕реЗ рдЖрдо рдЧрд▓рддрд┐рдпрд╛рдБ: рд╕реЗрд╡ рдкрд░ concurrency token рдирд╣реАрдВ рднреЗрдЬрдирд╛; рдЕрдкрдбреЗрдЯ рд╕рд┐рд░реНрдл id рд╕реЗ рдХрд░рдирд╛ рдмрдЬрд╛рдп id + version; рдпрд╛ рдХрдо рдкреНрд░рд┐рд╕рд┐рдЬрди рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдмрдбрд╝реЗ рдлрд╝реАрд▓реНрдбреНрд╕/рдРрд░реЗ рдХреЛ рдкреВрд░реЗ рд░реЗрдВрдбрд░ рд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рджреВрд╕рд░реЛрдВ рдХреЗ рдПрдбрд┐рдЯ рдорд┐рдЯ рд╕рдХрддреЗ рд╣реИрдВред

AppMaster рдореЗрдВ рдмрд┐рдирд╛ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЗ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдВ?

AppMaster рдореЗрдВ, Data Designer рдореЗрдВ рдПрдХ version рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ UI рдореЗрдВ рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ рдореЗрдВ рд░рдЦреЗрдВред Business Process рдХреЗ рдЕрдВрджрд░ conditional update рд▓рд╛рдЧреВ рдХрд░реЗрдВ рддрд╛рдХрд┐ write рдХреЗрд╡рд▓ рддрдм рд╣реЛ рдЬрдм expected version рдореИрдЪ рдХрд░реЗ, рдФрд░ UI рдореЗрдВ conflict рдмреНрд░рд╛рдВрдЪ рдХреЗ рд▓рд┐рдП reload/review flow рдмрдирд╛рдПрдВред

рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди
рдХреБрдЫ рдмрдирд╛рдПрдВ рдЕрджреНрднреБрдд

рдлреНрд░реА рдкреНрд▓рд╛рди рдХреЗ рд╕рд╛рде рдРрдкрдорд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рдЬрдм рдЖрдк рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ рддрдм рдЖрдк рдЙрдЪрд┐рдд рд╕рджрд╕реНрдпрддрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ
рдПрдбрдорд┐рди рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рд▓реЙрдХрд┐рдВрдЧ: рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рд░реЛрдХреЗрдВ | AppMaster