2012-04-24 2 views
2

MySQL documentation on transactions, кажется, не хватает одной важной части informaton, и вот мой вопрос:Автоматический откат, если программа выходит

Если транзакция выполняется и клиент отключается (в моем случае, если PHP exit s или die() или просто доходит до конца кода), является ли транзакция отмененной или завершена?

Я предполагаю, что откат, но это может быть проблемой, если массивное предположение неверно ...

Если это делает никакой разницы, все таблицы, используя двигатель InnoDB.

ответ

3

В нормальном случае отключение клиента приведет к откату в MySQL. Однако, если ваш сервер неожиданно опустится (например, аппаратный или сетевой сбой), до отключения вашего клиента может потребоваться немного времени. Из руководства 28800 секунд - это значение по умолчанию, которое сервер будет ожидать активности перед откатом транзакции.

Вы можете настроить параметры wait_timeout на своем сервере или имущество interactive_timeout, чтобы сократить это.

+0

Спасибо за подтверждение :) –

1

Согласно этой страницы: http://www.weberdev.com/ViewArticle/Using-Transactions-In-MySQL-Part-1

»... Интересно отметить, что если начать транзакцию, но выйти из сеанса перед выдачей ROLLBACK COMMIT или, MySQL делает не выполнить автоматический COMMIT , вместо этого он выдает ROLLBACK «

Я сделал несколько тестов, чтобы подтвердить это, и вот результаты для каждого из сценариев. (Примечание: при выходе из страницы без COMMIT, MySQL откаты автоматически):

mysql_query("START TRANSACTION"); 
mysql_query("INSERT INTO log SET temp = 'test'"); 

exit("Exit\n"); // Auto rollback; 

die("Die\n"); // Auto rollback; 

throw new Exception("Exception\n"); // Auto rollback; 

try { 
    throw new Exception("Exception\n"); 
} catch(Exception $e) { 
    echo "Caught\n"; // Committed; 
} 

require_once('invalid_file.php'); // Auto rollback; 

mysql_query('COMMIT'); 
+0

я заметил это поведение после того, как я случайно забыл 'COMMIT' перед возвращением ответа AJAX к особо сложным запрос. Понятно, что я пнул себя. –

+0

Это должно быть // Auto rollback в catch-catch вместо // commit –

Смежные вопросы