Какой запрос MySql использует PDO :: beginTransaction () для внутреннего использования? - PullRequest
0 голосов
/ 14 ноября 2018

Всякий раз, когда мне понадобилась транзакция в MySql, я использовал PDO :: beginTransaction () несколько раз без каких-либо проблем. Однако, когда мне нужно было заблокировать таблицы и по-прежнему использовать транзакции, я обнаружил, что

  1. "LOCK TABLES не безопасен для транзакций и неявно фиксирует любую активную транзакцию перед попыткой блокировки таблиц" и
  2. «UNLOCK TABLES неявно фиксирует любую активную транзакцию, но только если LOCK TABLES использовался для получения блокировок таблицы»,

в соответствии с этим https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html.

Но в приведенной выше ссылке также говорится, что «Правильный способ использования LOCK TABLES и UNLOCK TABLES с транзакционными таблицами, такими как таблицы InnoDB, состоит в том, чтобы начать транзакцию с SET autocommit = 0 (не START TRANSACTION), за которым следует LOCK TABLES, и не вызывать UNLOCK TABLES, пока вы не совершите транзакцию явно "

Я понимаю, что SET autocommit = 0 и START TRANSACTION технически одинаковы в MySql. Поправь меня на это. Но ссылка MySql выше говорит, что нужно использовать

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

Теперь вместо этого можно также использовать

PDO::beginTransaction();
LOCK TABLES ...;
PDO::commit();
UNLOCK TABLES;

Поскольку в PHP PDO :: beginTransaction () указано состояние «Отключение режима автоматической фиксации»?

...