PDO, mysql, транзакции и блокировка таблицы

Для забавы я заменяю 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;... и т.д.".

Спасибо за совет,

15
задан Travis 24 June 2010 в 01:52
поделиться

1 ответ

В MySQL начало транзакции отличается от выключения автоматической фиксации из-за того, как работает LOCK / UNLOCK TABLES. В MySQL LOCK TABLES фиксирует любые открытые транзакции, но отключение автокомментации фактически не запускает транзакцию. MySQL в этом смысле забавен.

В PDO запуск транзакции с использованием beginTransaction на самом деле не запускает новую транзакцию, а просто отключает автоматическую фиксацию. В большинстве баз данных это нормально, но может иметь побочные эффекты с упомянутым поведением MySQL.

Вам, вероятно, не следует полагаться на это поведение и то, как оно взаимодействует с причудами MySQL. Если вы собираетесь иметь дело с поведением MySQL при блокировке таблиц и DDL, вам следует избегать этого. Если вы хотите отключить автокоммит, выключите его вручную. Если вы хотите открыть транзакцию, откройте транзакцию вручную.

Вы можете свободно комбинировать методы PDO API для работы с транзакциями и SQL-командами, если не работаете с странностями MySQL.

6
ответ дан 1 December 2019 в 03:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: