MySQL: автоматический откат при сбое транзакции - PullRequest
1 голос
/ 11 мая 2010

Есть ли способ настроить MySQL на автоматический откат любой транзакции при первой ошибке / предупреждении?

Теперь, если все идет хорошо, он фиксирует транзакцию, но при неудаче оставляет транзакцию открытой, а при следующем запуске транзакции фиксирует незавершенные изменения из неудачной транзакции. Поэтому мне нужно автоматически откатить эти неудачные транзакции ..

(я выполняю запросы от php, но я не хочу проверять php на наличие сбоев, так как он будет делать больше вызовов между сервером MySQL и веб-сервером.)

Спасибо

Ответы [ 3 ]

1 голос
/ 11 мая 2010

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

try:
     <my code>
except:
     transaction.rollback()
     raise
else:
     transaction.commit()

- это в Python / Django, но оно должно напрямую транспонироваться в PHP - и для запуска новой транзакции требуется ровно столько же кода, независимо от того, есть проблема (исключение) или нет.

1 голос
/ 11 мая 2010

Извините, вам нужно будет сделать это самостоятельно. Я не PHP, но в SQL: если вы создаете транзакцию и выполняете несколько транзакций MySQL внутри транзакции, если вы откатываете транзакцию, все будет откатываться. ПРИМЕЧАНИЕ. Необходимо использовать механизм транзакционного хранилища, а для автоматической фиксации необходимо отключить.

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

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

0 голосов
/ 01 октября 2013

Ключевой момент, чтобы установить для автоматической фиксации значение false.

<?php
$database= new mysqli("sever", "user", "key", "database");
$database->autocommit(FALSE);
$error=0;

//asumming we want to delete a users infomation from two table
$database->query("delete from `pay` where `user`=1 ")?NULL:$error=1;
$database->query("delete from `users` where `id`=1 ")?NULL:$error=1;

if($error=0){
    $database->commit();
}  else {
    $database->rollback();
}
$database->close();
?>
...