ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π‘Π£ΠΠ MySQL Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠ°ΡΠΈΠ½Π°Ρ Ρ MySQL 5.5, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π²ΠΈΠΆΠΎΠΊ InnoDB. InnoDB ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ACID.
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ SQL, ΡΠ°ΠΊ ΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ API-ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠ° Π°Π²ΡΠΎΡΠΈΠΊΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (autocommit) ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ API ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #1 Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΠΆΠΈΠΌΠ° Π°Π²ΡΠΎΡΠΈΠΊΡΠ°ΡΠΈΠΈ (autocommit) ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ SQL ΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ API
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
/* Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ API */
$mysqli->autocommit(false);
/* ΠΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΡΡΡ ΠΈ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ */
$mysqli->query('SET AUTOCOMMIT = 0');
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ»ΡΠΆΠ±Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΈ
Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΠΌΠΎΠ³ΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ API-ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ»Π°Π³ΠΈΠ½ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ
ΡΠΎΠΎΠ±ΡΠ°ΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ
ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ API-ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π‘Π΅ΡΠ²Π΅Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ
ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠΈ Π±Π°Π·Ρ, Π΅ΡΠ»ΠΈ ΡΠΌΠ΅Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π°Π²ΡΠΎΡΠΈΠΊΡΠ°ΡΠΈΠΈ (autocommit), ΡΠΈΠΊΡΠ°ΡΠΈΡ ΠΈ ΠΎΡΠΊΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ
ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ SQL-Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #2 Π€ΠΈΠΊΡΠ°ΡΠΈΡ ΠΈ ΠΎΡΠΊΠ°Ρ
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query("INSERT INTO test(id) VALUES (1)");
$mysqli->rollback();
$mysqli->query("INSERT INTO test(id) VALUES (2)");
$mysqli->commit();Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ MySQL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΊΠ°ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠΈΡΡΡΡΡΡ Π½Π΅ΡΠ²Π½ΠΎ.
Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅