0

助けが必要です。

私は異なるファイルを持っています。例えば:

  • index.php、news.php
  • インクルード スクリプト: facebook.php、pay.php など。

すべてのページ (news.php を除く) で、トランザクションはスクリプトの最初で開始され、スクリプトの最後で終了します。

index.php や news.php などのページには、pay.php を含めます。しかし問題は、index.php にアクセスしているときにトランザクションがすでに開始されているため、2 つのトランザクションがアクティブになっていることです。しかし、news.php からスクリプトを呼び出すと、アクティブなトランザクションがないため、pay.php から transaction-start を削除することはできません。

(私のウェブサイトは、より多くのページやものではるかに複雑です)。

誰か助けてくれませんか?ありがとう!

4

1 に答える 1

1

最善の策は、ネストされたトランザクションをエミュレートすることです。これを行うには、データベース アクセス用のラッパーを作成します (疑似コード)。

class MyMysqli {
    protected $realDb;
    protected $transaction_count =0;

    public function __construct ($host, $username , $passwd, $dbname){
        $this->realDb = new Mysqli($host, $username, $passwd, $dbname);
    }
    public function __get($property){
        return $this->realDb->$property;
    }

    public function __set($property, $value){
        return $this->realDb->$property = $value;
    }

    public function __call($method, $args){
        return call_user_func_array(array($this->realDb, $method), $args);
    }

    // overload begin_transaction, commit and rollback
    public function begin_transaction(){
         $this->transaction_count++;
         if ($this->transaction_count == 1){
               $this->realDb->begin_transaction();
         }
    }
    public function commit(){
         $this->transaction_count--;
         if($this->transaction_count == 0){
              $this->realDb->commit();
         }
    }

    public function rollback(){
         throw new Exception("Error");
    }
于 2013-07-17T19:53:36.423 に答える