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() не выполняется для каждого из двух запросов по-отдельности). То есть по сути тут имеет место не откат транзакции, а просто невыполнение запроса, правда непоятно почему при это не выводится сообщение об ошибке.
Полезные ссылки:
- Log in to post comments
- 3717 reads
vedro-compota
Tue, 02/27/2018 - 19:24
Permalink
не исключено что дело в
не исключено что дело в режиме работы SQL или чем-то подобном.
_____________
матфак вгу и остальная классика =)