2012-12-06 56 views
1

我有一個類可以抓取頁面從頁面收集信息。然後它開始一個事務,並開始向不同的表添加信息(以確保所有信息都不被更新,因爲我在多次捲曲時遇到了一些問題,並不總是返回完整的頁面)。然後,如果保存的內容是新的,則該類將調用通知類,將這些通知保存到數據庫併發送電子郵件。我希望將保存在通知類中的信息作爲原始事務的一部分進行包含,因此,如果稍後用戶失敗,則不會收到通知。將PDO(InnoDB)事務傳遞給新類

我想我只是將當前的pdo句柄(打開事務)傳遞給我的新通知類並從那裏開始工作。當我使用此pdo句柄插入行,回滾並從通知類中退出腳本時,插入的行將粘貼到數據庫(即不回滾)。我確認了在原始類中使用相同的pdo句柄插入的數據已成功回退。我想我會嘗試在通知類中開始一個事務(儘管這對於應用程序的結構來說並不理想),但是我得到了一個PDOException'已經有一個活動事務'。

我不想(也不認爲我需要)顯示很多代碼,但這裏幾乎是發生了什麼事情。 crawl.php

$this->dbh; // connect 
$this->dbh->beginTransaction(); 
$this->doStuff->execute(); // does rollback 
$Notifications = new Notifications($id,$this->dbh); 

notifications.php

function __construct($id,$dbh) { 
    $this->dbh = $dbh; 
    // $this->dbh->beginTransaction(); -- transaction already started 
    $this->addRows->execute(); // does not roll back 
    $this->dbh->rollBack(); 
    exit; 
} 

UPDATE 1 我嘗試查詢 'SET自動提交= 0',然後 'ROLLBACK',但我得到了相同的結果。

UPDATE 2 我使用下面的代碼來檢查通知類是否在事務中,並且它並不意外地輸出'in transaction'。

if($this->dbh->inTransaction()) { 
    echo 'in transaction'; 
} 

更新3 最後更新,希望。來自notifications.php的PDO查詢被插入到不同的InnoDB表中。這會成爲一個問題嗎?

任何想法?

+0

注意:如果rollBack()/ exit調用是來自Notifications類或原始爬網類,則無關緊要。這兩個回滾所有更改crawl.php和none.php – Sam

+1

我假設你包括notifications.php。不管哪些功能回滾你的交易,都應該是這樣。應該回滾單個事務中的所有內容。我只能想象,在調用回滾之前調用其他函數中的任何地方都有提交。 –

+0

@BenjaminPaap,感謝您的幫助..我只是再次檢查,唯一的提交()被稱爲在腳本的最後(我有rollBack()並在此之前被稱爲退出)。你介意檢查更新3,我認爲這可能是罪魁禍首。 – Sam

回答

0

我一直在升級我的數據庫結構並重寫了很多後端代碼,並忘記將通知表從MyISAM更改爲InnoDB。感謝BenjaminPaap的幫助/興趣。

對不起對我們有用。