2013-03-23 26 views
1

我做了一个PHP类,它将一些数据写入多个表中。 我调用一些PHP函数将一些“标签”(4个标签,更具体)写入表格中。函数名称根据要写入的标签名称和表名称而不同,因此我将这些函数保存到了已注册的数组变量中,并且使用这些变量名称调用了这些函数。因为我使用了AUTOCOMMIT=0,我认为如果我没有放置COMMIT语句,这些函数将永远不会写入表中,但事实上它会写入1个没有COMMIT语句的第一个标签(它应该根本不写表) 。InnoDB Uncommited但书面(使用动态函数名称的PHP)

我检查了表,他们绝对使用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"); 
+0

难道说一个不相关的查询在这之后又犯了什么,而这一切都随之而来? – 2013-03-23 12:57:51

+0

马特,不,我没有任何其他查询,除了我放在那里。谢谢。 – 2013-03-23 13:19:17

回答

0

是您的PHP函数/包含的文件作出新的数据库连接?这可能会导致未决的事务提交

另外,如果你的任何PHP函数开始一个新的事务,即使AUTOCOMMIT = 0,那么这将迫使你的未决事务提交

+0

感谢您的回复。 我在一个php文件中只使用一个连接,任何使用此连接的函数都会将其列为全局(eq:global $ conn,$ dbName)。 此外,我没有在任何函数中使用其他提交。我在这堂课中使用了他们(因为这是我在基于班级的交易中的第一次尝试) – 2013-03-25 12:20:19