1

我制作了一个 PHP 类,它将一些数据写入许多表中。我调用一些 PHP 函数将一些“标签”(更具体的 4 个标签)写入表中。函数名称因要写入的标签名称和表名称而异,因此我将这些函数保存到已注册的数组变量中,并使用这些变量名称调用这些函数。

由于我使用过AUTOCOMMIT=0,我认为如果我没有放入 COMMIT 语句,这些函数将永远不会写入表,但事实是它写入了 1 个没有 COMMIT 语句的第一个标签(它根本不应该写入表)。

我检查了这些表,它们绝对在使用 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 回答