МОЯ ПЛАТФОРМА:
PHP и mySQL
МОЯ СИТУАЦИЯ:
Я пытаюсь реализовать транзакции в своем коде. Я пытался следовать примерам, но это не очень помогает. Я запускаю 3 запроса, и я хотел написать транзакцию таким образом, чтобы, если какой-либо запрос (ы) не прошел, вся транзакция должна откат. Я бы очень оценил простой, эффективный и не объектно-ориентированный PHP-код для достижения этой цели. Заранее спасибо.
MY PHP CODE:
//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? }
Для использования этой функции вам необходимо использовать расширение 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); ?>
Вам не нужно использовать 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, это намного более разумно.