У меня есть два сложных объекта PHP, каждый из которых имеет данные в нескольких таблицах MySQL.Как можно определить объект PDO 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();
}
Возможно, вам стоит рассмотреть возможность использования ограничений внешнего ключа (это означает, что вам придется переключиться с myISAM на движок, который их поддерживает) - таким образом вы можете использовать db для каскадирования для вас вместо имитации. – prodigitalson