Я сталкиваюсь с каким-то странным поведением с php, pdo и mysql при попытке использовать транзакции, и я уверен, что с этим не должно быть проблем, но есть.
Изменения записываются в базу данных, даже если должен быть выполнен откат!
Итак, я получил эту часть API, которая вносит изменения в данные в базе данных.
По какой-то причине запросы (query1 и query2) возвращают 0, что означает, что ни одна строка не была отредактирована.
Это довольно странно, так как данные в БД изменились, но это еще одна проблема ..
Так вот конкретный отрывок. Обратите внимание, что фактические запросы PDO заключаются в функции для масштабируемости и простоты использования, но они работают, не беспокойтесь.
if ($this->db->transaction('begin') == FALSE)
{
$this->application->setStatus('508002', 'Database transaction failure');
return FALSE;
}
$count = 0;
$query1 = $this->db->genericUpdate('someData');
$query2 = $this->db->genericDelete('someData');
$count += $query1 + $query2;
if ($count < 1)
{
$this->db->RWQuery('ROLLBACK'); // Tried invoking the rollback manually...
$this->log('Count', $count); // Count is 0 in log file...
if ($this->db->transaction('rollback') == FALSE)
{
$this->application->setStatus('508002', 'Database transaction failure');
return FALSE;
}
}
По какой-то странной причине сервер MySQL, похоже, игнорирует команду отката, отправляемую на сервер.
Я включил ведение журнала запросов в my.cnf:
649 Query START TRANSACTION
649 Query UPDATE `tbl` SET bla = 'foo' WHERE blub = 'bar' LIMIT 1
649 Query DELETE FROM `tbl2` WHERE bla = 'fooo'
649 Query ROLLBACK
649 Query rollback
649 Quit
Движками базы данных являются InnoDB, я проверял дважды или больше.
Также не выдается никаких исключений ни в журналах ошибок Apache / PHP, ни в каких-либо других средствах системного журнала.
Также я не выдаю DDL-операторов, которые могли бы инициировать фиксацию.
Я не нашел ничего похожего на мою проблему в сети, и я хотел бы услышать, если бы кто-то испытывал подобные проблемы.