В PHP можно ли заставить MySQL откатить транзакцию, если я отключаюсь без фиксации, а не фиксирую ее? - PullRequest
1 голос
/ 25 октября 2010

Если бы я запустил следующий PHP, я бы не ожидал, что никакое значение будет вставлено в тестовую таблицу, потому что у меня есть транзакция, которую я не совершил:

$db = mysql_connect("localhost","test","test");
mysql_select_db("test");
mysql_query("begin transaction;");
mysql_query("insert into Test values (1);") or die("insert error: ". mysql_errror());
die('Data should not be commited\n');
mysql_query("commit;"); // never occurs because of the die()

Но вместо этого она, кажется, фиксируеттем не мение.Есть ли способ отключить это поведение без отключения автоматической фиксации для PHP, который не использует транзакции в других местах на сайте?

Редактировать: Это была просто глупая опечатка.Это должно быть «начало транзакции» или «начало».Не «начать транзакцию».Извините, что потратил время людей.

Ответы [ 3 ]

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

Использовать mysql_query ('BEGIN'). SQL «BEGIN TRANSACTION» недопустим (и фактически mysql_query возвращает false для этого запроса, что означает, что произошла ошибка). Это не работает, потому что вы никогда не начинаете транзакцию.

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

Синтаксис для запуска транзакции:

START TRANSACTION

Функция, о которой вы говорите , это AUTOCOMMIT.Если вы не хотите этого, вам придется отключить его:

SET autocommit = 0

Ссылку можно найти по адресу http://dev.mysql.com/doc/refman/5.1/en/commit.html

. Я также рекомендую проверить возвращаемое значениевсе функции mysql _... ().Вы не можете предполагать, что они всегда будут работать успешно.

0 голосов
/ 24 декабря 2012

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

Если вы хотите выполнить автоматический откат, это также объясняется в руководстве:

The current transaction is not rolled back. To have the entire transaction roll back, start the server with the `--innodb_rollback_on_timeout` option.
...