Как может объект PHP PDO определить, уже ли он находится в транзакции MySQL?

У меня есть два сложных объекта PHP, каждый из которых содержит данные в нескольких таблицах MySQL.

Иногда мне просто нужно удалить один объект A из базы данных, а это занимает 3 SQL

Иногда мне нужно удалить один объект B из базы данных, для чего требуется 4 оператора SQL, и который также должен найти и удалить все объекты A, которыми владеет объект B.

Итак, внутри функции delete_A () я выполняю эти операторы внутри транзакции. Внутри функции delete_B () я хочу запустить одну большую большую транзакцию, которая охватывает действия внутри delete_A (). Если весь атом удаления B не удается, мне нужно восстановить все его A в откате.

Как мне обновить определение delete_A (), чтобы открыть только новую транзакцию , если нет уже не выполняется большая транзакция.

Я ожидал, что смогу сделать что-то подобное, но атрибут autocommit , похоже, не изменяется с помощью beginTransaction ()

function delete_A($a){
  global $pdo;
  $already_in_transaction = !$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  if(!$already_in_transaction){
    $pdo->beginTransaction();
  }

  //Delete the A

  if(!$already_in_transaction){
    $pdo->commit();
  }
}
function delete_B($b){
  global $pdo;
  $pdo->beginTransaction();
  foreach($list_of_As as $a){
    delete_A($a);
  }
  $pdo->commit();
}
6
задан Jeremy Wadhams 1 September 2010 в 00:58
поделиться