Подтвердить что ты не робот

PDO Транзакции и вызовы функций

Могут ли функционировать вызовы в блоке транзакций PDO? Это упрощенный код (с использованием базы данных MySql)...

try{  
  $db->beginTransaction();  

  // call to function that creates user
  $user_id = create_user();  

  // call to function that creates company      
  $company_id = create_company();

  // call to function to link user & company
  add_user_to_company($user_id, $company_id);

  $db->commit();  
}

Если это не может произойти с использованием транзакций, какова рекомендуемая стратегия?

4b9b3361

Ответ 1

Если ни один из этих вызовов функций не пытается открыть или совершить транзакцию самостоятельно или использовать другое соединение, кроме того, которое хранится в $db, да, оно должно работать нормально. Объект PDO (или RDBMS, если на то пошло) не знает или не заботится о том, вызываете ли вы другие функции в PHP. Все, что он знает, это то, что действие происходит в том же открытом соединении, что и открытое в $db. Мы предполагаем, что эти функции либо принимают $db в качестве параметра, либо получают доступ к нему по всему миру.

Помните, что хотя PDO отслеживает состояние транзакции (отображается через PDO::inTransaction()), это действительно RDBMS, которая управляет состоянием транзакции, а не PDO или кодом приложения PHP. Если функция пытается открыть новую транзакцию до того, как предыдущая была совершена, документированное поведение MySQL заключается в автоматической фиксации предыдущей транзакции, поскольку она не поддерживает вложенность транзакций.

Поэтому просто убедитесь, что ваши дополнительные вызовы функций не пытаются изменить состояние транзакции.