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(...);
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ:
- рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛
- рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (
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 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ