1

ページをクロールしてページから情報を収集するクラスがあります。次に、トランザクションを開始し、さまざまなテーブルへの情報の追加を開始します (すべての情報が更新されるか、まったく更新されないかを確認するためです。これは、マルチカールで常に完全なページが返されるとは限らないという問題があったためです)。次に、保存されたコンテンツが新しい場合、クラスはこれらの通知をデータベースに保存して電子メールを送信する通知クラスを呼び出します。通知クラスに保存された情報を元のトランザクションの一部として含めたいので、後で何かが失敗した場合、ユーザーは通知を受け取りません。

現在の pdo ハンドル (開いているトランザクションを含む) を新しい通知クラスに渡し、そこから作業するだけだと考えました。この pdo ハンドルを使用して行を挿入し、ロールバックして通知クラスからスクリプトを終了すると、挿入された行はデータベースに残ります (つまり、ロールバックしません)。元のクラスに同じ pdo ハンドルで挿入されたデータが正常にロールバックされることを確認しました。通知クラスでトランザクションを開始しようとしましたが (これはアプリケーションの構造にとって理想的ではありませんが)、PDOException 'There is already a active transaction' を受け取りました。

多くのコードを表示したくはありません (また、表示する必要もないと思います) が、ここではほとんど何が行われているのかを示します。クロール.php

$this->dbh; // connect
$this->dbh->beginTransaction();
$this->doStuff->execute(); // does rollback
$Notifications = new Notifications($id,$this->dbh);

notifications.php

function __construct($id,$dbh) {
   $this->dbh = $dbh;
   // $this->dbh->beginTransaction(); -- transaction already started
   $this->addRows->execute(); // does not roll back
   $this->dbh->rollBack();
   exit;
}

UPDATE 1 「SET autocommit = 0」、次に「ROLLBACK」をクエリしようとしましたが、同じ結果が得られました。

UPDATE 2 次のコードを使用して、通知クラスがトランザクション内にあるかどうかを確認しましたが、驚くほど「トランザクション内」に出力されませんでした。

 if($this->dbh->inTransaction()) {
    echo 'in transaction';
 }

更新 3 最終更新です。うまくいけば。notifications.php から作成された PDO クエリは、異なる InnoDB テーブルに挿入されます。これは問題になるでしょうか?

何か案は?

4

1 に答える 1

0

データベース構造をアップグレードし、多くのバックエンド コードを書き直しましたが、通知テーブルを MyISAM から InnoDB に変更するのを忘れていました。ヘルプ/関心を寄せてくれた BenjaminPaap に感謝します。

無駄な質問ですみません。

于 2012-12-06T21:48:18.470 に答える