Ich habe zwei komplizierte PHP-Objekte, von denen jedes Daten in ein paar MySQL-Tabellen enthält.Wie kann ein PHP-PDO-Objekt herausfinden, ob es bereits in einer MySQL-Transaktion ist?
Manchmal muss ich nur ein Objekt A aus der Datenbank entfernen, und das dauert 3 SQL-Anweisungen.
Manchmal muss ich ein Objekt B aus der Datenbank entfernen, das dauert 4 SQL-Anweisungen, und die auch muss alle Objekte des Objekts A finden und entfernen, die das Objekt B besitzt.
Also innerhalb der Funktion delete_A(), führe ich diese Anweisungen innerhalb einer Transaktion. Innerhalb der Funktion, die delete_B(), möchte ich eine große große Transaktion ausführen, die die Aktivitäten innerhalb von delete_A() abdeckt. Wenn das gesamte Atom, das ein B löscht, fehlschlägt, muss ich alle seine A's im Rollback wiederherstellen.
Wie aktualisiere ich die Definition von delete_A(), um nur eine neue Transaktion zu öffnen, wenn nicht bereits eine größere Transaktion ausgeführt wird.
ich voraussichtlich in der Lage sein, so etwas zu tun, aber das autocommit
Attribut scheint nicht von 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();
}
Sie könnten in Erwägung ziehen, Fremdschlüsseleinschränkungen zu verwenden (bedeutet, dass Sie von myISAM zu einer Engine wechseln müssen, die sie unterstützt). Auf diese Weise können Sie die db Kaskadierung für Sie löschen, anstatt sie zu emulieren. – prodigitalson