php, mysql Транзакции и Ошибки в синтаксисе -- что откавается, а что нет. Когда выводится сообщение
Primary tabs
Forums:
Опять же разбираем проблему отката транзакций в mysql.
Пишут, что:
....в случае SQL ошибки, транзакция сама по себе не откатится.
С этим утверждением не всё ясно.
Вот тут показана подобная ситуация (демонсрация для командной строки):
mysql> create table t7 (id integer primary key auto_increment, name text, lastname text);
Query OK, 0 rows affected (0.04 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (name, lastname) values('name1', 'lastname1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (name, lastname) ('name1', 'lastname1');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ''name
1', 'lastname1')' at line 1
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t7;
+----+-------+-----------+
| id | name | lastname |
+----+-------+-----------+
| 1 | name1 | lastname1 |
| 2 | name1 | lastname1 |
+----+-------+-----------+
2 rows in set (0.00 sec)
-- то есть последний (третий) insert запрос (который как раз составлен с ошибкой в синтаксисе -- пропущено слово values) не приводит к откату транзакции.
Тем не менее мы наблдаем ситуацию когда в php pdo запрос вида:
$sql = "START TRANSACTION;"
. "INSERT INTO corrections SET id_goods=:id_goods, number=:number, id_orders=:id_orders
ON DUPLICATE KEY UPDATE number = number + :number;"
. " rqerFSEFdsf UPDATE goods SET reserve = reserve + :number, available = available - :number WHERE id = :id_goods;"
. "COMMIT";
откатывается без всяких сообщений об ошибки (первый insert не выполнятся, хотя с ним всё ок).
Не связано ли это с тем, что синтаксический анализатор даже не выполняет первый запрос вдия ошибку во втором? Ведь они отправлены вместе (php pdo->execute() не выполняется для каждого из двух запросов по-отдельности). То есть по сути тут имеет место не откат транзакции, а просто невыполнение запроса, правда непоятно почему при это не выводится сообщение об ошибке.
Полезные ссылки:
- https://stackoverflow.com/questions/17402610/mysql-transaction-is-committed-even-when-error-occurred
- https://dev.mysql.com/doc/refman/5.7/en/innodb-error-handling.html
- Log in to post comments
- 4466 reads
vedro-compota
Tue, 02/27/2018 - 19:24
Permalink
не исключено что дело в
не исключено что дело в режиме работы SQL или чем-то подобном.
_____________
матфак вгу и остальная классика =)