PHP и MySQL: простой код для реализации транзакций - Commit & Rollback - PullRequest
6 голосов
/ 25 января 2010

МОЯ ПЛАТФОРМА:

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 ]

16 голосов
/ 25 октября 2010

Вам не нужно использовать 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, это намного более вменяемое.

6 голосов
/ 25 января 2010

Вам нужно использовать расширение mysqli , чтобы использовать эту функцию.

См .: autocommit () , commit () и rollback ()

<?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);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...