PHP и MySQL: Простой код для реализации транзакции - Фиксация и откат
МОЯ ПЛАТФОРМА:
PHP и MySQL
МОЯ СИТУАЦИЯ:
Я пытаюсь реализовать транзакции в своем коде. Я пытался следовать примерам, но это не очень помогает. Я выполняю 3 запроса, и я хотел написать транзакцию таким образом, чтобы в случае сбоя любого из запросов вся транзакция должна была откатиться. Я был бы очень признателен за простой, эффективный и не объектно-ориентированный PHP-код для достижения этой цели. Благодарю вас в продвижение.
МОЙ PHP-КОД:
//db_res calls a custom function that performs a mysql_query on the query
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3");
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10");
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20");
if( $res1 && $res2 && $res3 )
{
//commit --- but how?
}
else
{
//rollback --- but how?
}
2 answers
Для использования этой функции вам необходимо использовать расширение mysqli.
См.: автоматическая фиксация(), фиксация() и откат()
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* disable autocommit */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE myCity LIKE City");
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB");
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50");
/* commit insert */
mysqli_commit($link);
/* delete all rows */
mysqli_query($link, "DELETE FROM myCity");
if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
$row = mysqli_fetch_row($result);
printf("%d rows in table myCity.\n", $row[0]);
/* Free result */
mysqli_free_result($result);
}
/* Rollback */
mysqli_rollback($link);
if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
$row = mysqli_fetch_row($result);
printf("%d rows in table myCity (after rollback).\n", $row[0]);
/* Free result */
mysqli_free_result($result);
}
/* Drop table myCity */
mysqli_query($link, "DROP TABLE myCity");
mysqli_close($link);
?>
Вам не нужно использовать mysqli. Вы можете просто выдавать команды транзакций в виде запросов.
Итак, для вашего примера:
mysql_query("start transaction;");
//db_res calls a custom function that performs a mysql_query on the query
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3");
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10");
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20");
if( $res1 && $res2 && $res3 )
{
mysql_query("commit;");
}
else
{
mysql_query("rollback;");
}
Кстати, если вы думаете об обновлении до mysqli, пожалуйста, не делайте этого. Вместо этого перейдите на PDO, это гораздо более разумно.