Если расширение PHP mysql предположительно не поддерживает транзакции, такие как mysqli, почему я вижу людей, использующих его для онлайн-транзакций? - PullRequest
5 голосов
/ 04 октября 2011

Я читал о транзакциях mysql, и у меня сложилось впечатление, что для создания транзакций вам пришлось использовать либо mysqli, либо PDO. Тем не менее, я вижу повсеместный обмен стеками и другие примеры сайтов, которые используют расширение mysql, например:

mysql_query("START TRANSACTION");
$rollback=0

if (!mysql_query($query1)){
$rollback=1
}

if (!mysql_query($query2)){
$rollback=1
}

if (!mysql_query($query3)){
$rollback=1
}

if ($rollback == 1){
mysql_query("ROLLBACK");
}
else{
mysql_query("COMMIT");
}

В чем разница между этим и использованием "специальных" специфичных для mysqli функций mysqli :: rollback и mysqli :: commit?

Кроме того, что произойдет, если произойдет сбой php-скрипта (т. Е. Произошел сбой сервера приложений и т. Д.), Автоматически ли сервер БД откатит транзакцию через заданный период времени?

Точно так же, что произойдет, если сервер БД выйдет из строя до mysql_query ("COMMIT")? Будет ли транзакция «откатана»?

Спасибо!

1 Ответ

7 голосов
/ 04 октября 2011

Это также совершенно законно и использует операторы MySQL непосредственно для реализации транзакции.

И, честно говоря, я не вижу никаких улучшений при использовании синтаксиса mysqli. Это неудачная абстракция, поскольку она отображает 1: 1 только на MySQL. Было бы разумнее использовать синтаксис более высокого уровня в PDO , поскольку он будет отображаться с другим синтаксисом в соответствии с базовой БД.

Однако, как говорит Хакре: mysqli предпочтительнее for performance and interoperability reasons, it's the recommended mysql lib in PHP.

Аналогичным образом, что произойдет, если сервер БД выйдет из строя до выполнения mysql_query ("COMMIT")? Будет ли транзакция «откатана»?

Проще сбой прикладной программы, а не сервера БД. Любая не зафиксированная транзакция будет откатана.

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

Время ожидания в секундах, в течение которого транзакция InnoDB может ожидать блокировку строки, прежде чем отказаться. Значение по умолчанию составляет 50 секунд. Транзакция, которая пытается получить доступ к строке, заблокированной другой транзакцией InnoDB, будет зависать не более этого количества секунд, прежде чем выдать следующую ошибку:

ОШИБКА 1205 (HY000): превышено время ожидания блокировки; попробуйте перезапустить транзакцию

...