1

いくつかのデータをいくつかのテーブルに書き込む PHP クラスを作成しました。いくつかの "ラベル" (より具体的には 4 つのラベル) をテーブルに書き込むために、いくつかの PHP 関数を呼び出します。書き込むラベル名やテーブル名によって関数名が異なっていたので、これらの関数を登録済みの配列変数に保存し、これらの変数名を使ってこれらの関数を呼び出しました。

私が使用したのでAUTOCOMMIT=0、COMMITステートメントを入れないとこれらの関数がテーブルに書き込まれないと思っていましたが、実際にはCOMMITステートメントなしで最初のラベルを1つ書き込みます(テーブルはまったく書き込まれないはずです)。

テーブルを確認したところ、それらは完全に InnoDB を使用していました。また、mysql コンソールを使用して行ったいくつかのコミット/ロールバック テストは、通常の動作のままです (通常どおりにコミット/ロールバックされます)。

ここで見逃したものや間違っているものはありますか? または、この問題を解決するためのリンク/リソースを教えてください。

どうもありがとうございました。

ここに、動的関数呼び出しを含む php コードを配置します。

mysql_query("SET AUTOCOMMIT=0", $conn) or die(toAlert(mysql_error() . " on " . __FUNCTION__ . " line " . __LINE__ . " file " . __FILE__));
        mysql_query("START TRANSACTION", $conn) or die(toAlert(mysql_error() . " on " . __FUNCTION__ . " line " . __LINE__ . " file " . __FILE__));
        if (count($this->parentEntries) > 0) {

        foreach ($this->accounts as $label => $labelSrc) {

            echo "$label: $labelSrc\n";

            $_label = $label;
            $_companyID = $this->companyID;
            $_outletID = $this->outlet2ID;

            $_tgl = $this->tgl;
            $_bln = $this->bln;
            $_thn = $this->thn;

            $_jml = $this->parentEntries[$labelSrc]['qty'];
            $_nilai = $this->parentEntries[$labelSrc]['value'];
            $_jmlnota = 1;

            switch ($this->peopleLabel) {
                case "Supplier":
                    $_supplierID = $this->peopleID;
                    break;
                case "Customer":
                    $_customerID = $this->peopleID;
                    break;
                default:
                    break;
            }

            include "RegisterPBUFunctions.php";
            foreach ($this->parentRels as $relName) {
                $doYourJob = $arrPBUFunctions[$relName](
                    $arrPBUParams[$relName][0],
                    $arrPBUParams[$relName][1],
                    $arrPBUParams[$relName][2],
                    $arrPBUParams[$relName][3],
                    $arrPBUParams[$relName][4],
                    $arrPBUParams[$relName][5],
                    $arrPBUParams[$relName][6],
                    $arrPBUParams[$relName][7],
                    $arrPBUParams[$relName][8],
                    $arrPBUParams[$relName][9],
                    $arrPBUParams[$relName][10],
                    $arrPBUParams[$relName][11],
                    $arrPBUParams[$relName][12],
                    $arrPBUParams[$relName][13]
                ) or die("error on " . __FILE__ . " line " . __LINE__);
            }
        }
    }
    //$doApply = (mysql_query("COMMIT", $conn)) or die("Failed to apply transaction");
4

1 に答える 1

0

PHP 関数/インクルード ファイルは新しいデータベース接続を作成していますか? これにより、保留中のトランザクションがコミットされる可能性があります

また、PHP 関数のいずれかが新しいトランザクションを開始する場合、AUTOCOMMIT=0 であっても、保留中のトランザクションが強制的にコミットされます。

于 2013-03-25T11:52:38.580 に答える