Примеры транзакций MySQL PHP +

Я действительно не нашел нормальный пример файла PHP, где транзакции MySQL используются. Можно ли показать мне простой пример этого?

И еще один вопрос. Я уже сделал большое программирование и не использовал транзакции. Я могу вставить функцию PHP или что-то header.php это, если один mysql_query сбои, затем другие перестали работать также?


Я думаю, что понял это, действительно ли это правильно?:

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");

if ($a1 and $a2) {
    mysql_query("COMMIT");
} else {        
    mysql_query("ROLLBACK");
}
284
задан Bill the Lizard 12 December 2011 в 01:45
поделиться

2 ответа

Идея, которую я обычно использую при работе с транзакциями, выглядит так (полу-псевдокод) :

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}


Обратите внимание, что с этой идеей, если запрос не выполняется, должно быть выброшено исключение:

  • PDO может это сделать, в зависимости от того, как вы его сконфигурируете
  • иначе, с каким-либо другим API, вам, возможно, придется проверить результат функции, используемой для выполнения запроса, и самостоятельно создать исключение.


К сожалению, здесь нет магии. Вы не можете просто поместить где-нибудь инструкцию и выполнять транзакции автоматически: вам все равно нужно указать, какая группа запросов должна быть выполнена в транзакции.

Например, довольно часто у вас будет несколько запросов перед транзакцией (до begin ) и еще пара запросов после транзакции (после любого commit или откат ) , и вы захотите, чтобы эти запросы выполнялись независимо от того, что произошло (или нет) в транзакции.

319
ответ дан 23 November 2019 в 01:52
поделиться

Кажется, я понял это, верно?:

mysql_query("START TRANSACTION");

$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");

if ($a1 and $a2) {
    mysql_query("COMMIT");
} else {        
    mysql_query("ROLLBACK");
}
107
ответ дан 23 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: