PHP рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг

Habr├й рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PHP рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд▓реЗрдЦ рдереЗред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛рдлреА рдЕрдореВрд░реНрдд рдереЗ, рдХреБрдЫ рдирд╣реАрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рджреВрдВрдЧрд╛ред

рдЬрдм рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд┐рдирд╛ PHP рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ (MySQL рдХреЗ рд╕рд╛рде MySQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ MYSQL рдХреЗ рд╕рд╛рде PHP 5.4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред

рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, autocommit рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ true рд╕реЗрдЯ рд╣реЛрддреА true ред рдЖрдк рдЗрд╕реЗ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рддрджрдиреБрд╕рд╛рд░, рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ autocommit рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ autocommit , рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ (рдЕрдВрдд рдореЗрдВ commit рдпрд╛ rollback ) рдХреЗ рдмрд╛рдж, рдлрд┐рд░ рд╕реЗ autocommit рдЪрд╛рд▓реВ рдХрд░реЗрдВред

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

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдмрджреНрдз рд╕рдореВрд╣ рдХреЗ рдкреВрд░рд╛ рд╣реЛ autocommit рдмрд╛рдж autocommit рдХреЛ рдЕрдХреНрд╖рдо рдФрд░ рд╕рдХреНрд╖рдо autocommit ред рд╕рд╢рд░реНрдд рдХреЛрдб (рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реЛрддреА рд╣реИ):

 public function save() { $result = $this->db->update(...); //     -  ,       . if (!$result) throw new Exception('Error while saving'); } public function append_log() { $result = $this->db->insert(...); if (!$result) throw new Exception('Error while append'); } public function add() { $this->db->autocommit(false); try { $this->save(); $this->append_log(); $this->db->commit(); } catch (Exception $e) { $this->db->rollback(); } $this->db->autocommit(true); } 


рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ:
  1. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛
  2. рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ ( save() рдпрд╛ append_log() ) рднреА рдХрдИ рд▓рдЧрд╛рддрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ append_log() рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдлрд┐рд░ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ autocommit рдХрд┐ autocommit рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ commit рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк commit рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ commit , рддреЛ рдореВрд▓ рдкрд░рд┐рд╡рд░реНрддрди рднреА рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред


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

 public function transaction(callable $block) { $exception = null; if ($need_to_off = $this->isAutocommitOn()) $this->mysqli->autocommit(false); try { $block(); } catch (Exception $e) { $exception = $e; } if ($need_to_off) { if ($exception == null) { $this->db->mysqli->commit(); } else { $this->db->mysqli->rollback(); } $this->mysqli->autocommit(true); } if ($exception) throw $exception; } public function isAutocommitOn() { if ($result = $this->db->mysqli->query("SELECT @@autocommit")) { $row = $result->fetch_row(); $result->free(); } return isset($row[0]) && $row[0] == 1; } 


рд╣рдо рдЕрдкрдиреА рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рднреЗрдЬрддреЗ рд╣реИрдВред рдпрджрд┐ autocommit рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ transaction рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ commit рдпрд╛ rollback , рдФрд░ рдлрд┐рд░ autocommit рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо autocommit ред рдпрджрд┐ autocommit рдкрд╣рд▓реЗ autocommit рд╣реА рдмрдВрдж рд╣реИ, рддреЛ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдСрдЯреЛрдХреЙрдорд┐рдЯ рдХрд╛ рдХрд╣реАрдВ рдФрд░ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 public function save_all() { $this->transaction(function(){ $this->save(); $this->append_log(); }); } 


PS: рдХреНрд▓реЛрдЬрд░ рдореЗрдВ $this PHP рд╕рдВрд╕реНрдХрд░рдг 5.4 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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


All Articles