Я действительно не нашел нормальный пример файла 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");
}
Идея, которую я обычно использую при работе с транзакциями, выглядит так (полу-псевдокод) :
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 :: setAttribute
PDO :: ATTR_ERRMODE
и PDO :: ERRMODE_EXCEPTION
К сожалению, здесь нет магии. Вы не можете просто поместить где-нибудь инструкцию и выполнять транзакции автоматически: вам все равно нужно указать, какая группа запросов должна быть выполнена в транзакции.
Например, довольно часто у вас будет несколько запросов перед транзакцией (до begin
) и еще пара запросов после транзакции (после любого commit
или откат
) , и вы захотите, чтобы эти запросы выполнялись независимо от того, что произошло (или нет) в транзакции.
Кажется, я понял это, верно?:
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");
}