Я действительно не нашел нормальный пример файла 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");
}
php
mysql
transactions
Добрый вечер
источник
источник
mysql_query("BEGIN");
вместо последовательностиmysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
функции в новом коде . Они больше не поддерживаются и официально устарели . Видишь красную коробку ? Вместо этогоузнайте о готовых утверждениях и используйте PDO или MySQLi - эта статья поможет вам решить, какие именно. Если вы выбираете PDO, вот хороший урок .mysql
Вун умрет, несмотря на то, что он устарел, он будет доступен в PECL навсегда.mysql
Ответы:
Идея, которую я обычно использую при работе с транзакциями, выглядит следующим образом (полупсевдокод) :
Обратите внимание, что с этой идеей, если запрос не выполняется, должно быть сгенерировано исключение:
PDO::setAttribute
PDO::ATTR_ERRMODE
иPDO::ERRMODE_EXCEPTION
К сожалению, в этом нет никакой магии. Вы не можете просто поместить инструкцию куда-нибудь и сделать транзакции автоматически: вам все еще нужно определить, какая группа запросов должна быть выполнена в транзакции.
Например, довольно часто у вас будет пара запросов до транзакции (до
begin
) и еще пара запросов после транзакции (после илиcommit
илиrollback
), и вы захотите, чтобы эти запросы выполнялись независимо от того, что произошло (или нет) в перевод.источник
$db
тип здесь? MySQLi?PDOException
и даже проверять значения исключений, если это необходимо. us2.php.net/PDOExceptionЯ думаю, что я понял это, правильно?
источник
источник
Так как это первый результат в Google для «транзакции php mysql», я подумал, что добавлю ответ, который явно демонстрирует, как это сделать с помощью mysqli (поскольку первоначальный автор хотел примеры). Вот упрощенный пример транзакций с PHP / mysqli:
Также имейте в виду, что в PHP 5.5 появился новый метод mysqli :: begin_transaction . Тем не менее, это еще не задокументировано командой PHP, и я все еще застрял в PHP 5.3, поэтому я не могу это комментировать.
источник
$conn->autocommit(FALSE)
в приведенном выше примере влияет только на отдельное соединение - оно не влияет на любые другие соединения с базой данных.if (!result)
, должен делатьif (result === false)
, если запрос способен вернуть действительный результат, который будет иметь значение false или ноль.Пожалуйста, проверьте, какой механизм хранения вы используете. Если это MyISAM, то
Transaction('COMMIT','ROLLBACK')
не будет поддерживаться, потому что транзакции поддерживает транзакции только механизм хранения InnoDB, а не MyISAM.источник
При использовании подключения PDO:
Я часто использую следующий код для управления транзакциями:
Пример использования:
Таким образом, код управления транзакциями не дублируется по всему проекту. Это хорошо, потому что, судя по другим ответам PDO в этой ветке, в этом легко допустить ошибки. Наиболее распространенными из них являются забывание перебрасывать исключение и запуск транзакции внутри
try
блока.источник
Я сделал функцию для получения вектора запросов и выполнения транзакции, может быть, кто-то найдет это полезным:
источник
Я имел это, но не уверен, что это правильно. Можно попробовать это тоже.
Идея отсюда: http://www.phpknowhow.com/mysql/transactions/
источник
mysql_query
вместо использованияmysqli
, даже если вы ссылаетесь на учебник, который используетmysqli
. ИМХО, вы должны либо удалить этот плохой пример, либо заменить его, чтобы использовать код, как написано в руководстве по phpknowhow.Еще один пример процедурного стиля с
mysqli_multi_query
, предполагает$query
, заполняется разделенных точкой с запятой операторов.источник
mysqli_multi_query
. Любой, кто заинтересован в этом, должен искать в другом месте Google для более чистого примера.