0

顧客を自動的にインポートするために、hikashop (eshop コンポーネント) コンポーネントを使用して joomla(2.5) を作成しています。問題は、期待どおりに機能しない JDatabase トランザクションを使用していることです (ロールバックが機能しません)。メソッド processSingle は各顧客を処理し、成功したかどうかを返します。また、デバッグのために、どのメソッド (ステップ) が失敗したかを知るためのパラメーターがもう 1 つあります。同じロールバック構造を使用する別のスクリプトを作成しましたが、機能しているように見えますが、これは機能しません。DatabaseException をキャッチしようとしましたが、例外はありません。トランザクションのロールバックに失敗するコードの一部があります。

foreach ($this->customerList as $customer) {
        // start tracking database entries
        $this->db->transactionStart();

        $oCustomer = new stdClass();
        $oCustomer->raw_data = $customer;
        // escaping from sql injection
        $oCustomer = $this->escapeObj($oCustomer);
        // here we process all items taking one and going through all steps
        $methodfailed = "";
        $success = $this->processSingle($oCustomer, $methodfailed);
        $processed++;
        if ($success) {
            $succeeded++;
            // if succeded save changes
            $this->db->transactionCommit();
        } else {
            $failed++;
            echo $this->error . "<br/>";
            echo "failed method:" . $methodfailed . "<br/>";
            // if failed rollback database entries
            $this->db->transactionRollback();
        }
    }

誰かが同様の問題を抱えていましたか?ちなみにPHP/5.3.3-7を使っています。

4

2 に答える 2

0

何が原因かわかりませんtransactionStartが、InnoDB テーブルだけがトランザクションをサポートしています。DB テーブルが MyISAM であることは間違いありません。

于 2012-10-05T14:15:54.623 に答える
0

自動コミットモードがオンになっているかどうか、mysql 構成を確認してください。オフにすると役立ちます。これについて詳しくは、 http://dev.mysql.com/doc/refman/5.0/en/commit.htmlをご覧ください。

また、テーブルが InnoDB であるかどうかを確認する必要があります。MyISAM はトランザクションをサポートしていません。

于 2012-10-05T14:16:14.880 に答える