Для забавы я заменяю mysqli расширение в своем приложении с PDO.
Однажды в некоторое время я должен использовать транзакции + блокировка таблицы.
В этих ситуациях, согласно mysql руководству, должен несколько отличаться синтаксис. Вместо вызова ЗАПУСКАЮТ ТРАНЗАКЦИЮ, Вы делаете это как так...
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
(http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)
Мой вопрос, как делает это взаимодействует с PDO:: beginTransaction? Могу я использовать PDO:: beginTransaction в этом случае? Или если я вручную отправляю sql "автоматическая фиксация НАБОРА = 0;... и т.д.".
Спасибо за совет,
В MySQL начало транзакции отличается от выключения автоматической фиксации из-за того, как работает LOCK / UNLOCK TABLES. В MySQL LOCK TABLES фиксирует любые открытые транзакции, но отключение автокомментации фактически не запускает транзакцию. MySQL в этом смысле забавен.
В PDO запуск транзакции с использованием beginTransaction
на самом деле не запускает новую транзакцию, а просто отключает автоматическую фиксацию. В большинстве баз данных это нормально, но может иметь побочные эффекты с упомянутым поведением MySQL.
Вам, вероятно, не следует полагаться на это поведение и то, как оно взаимодействует с причудами MySQL. Если вы собираетесь иметь дело с поведением MySQL при блокировке таблиц и DDL, вам следует избегать этого. Если вы хотите отключить автокоммит, выключите его вручную. Если вы хотите открыть транзакцию, откройте транзакцию вручную.
Вы можете свободно комбинировать методы PDO API для работы с транзакциями и SQL-командами, если не работаете с странностями MySQL.