1

我有一个类可以爬取页面并从页面中收集信息。然后它开始一个事务并开始将信息添加到不同的表中(以确保所有或不更新所有信息,因为我遇到了多卷曲并不总是返回完整页面的一些问题)。然后,如果保存的内容是新的,则该类调用通知类,该类将这些通知保存到数据库并发送电子邮件。我希望保存在通知类中的信息作为原始事务的一部分包含在内,因此如果稍后出现故障,用户将不会收到通知。

我想我只需将当前的 pdo 句柄(带有打开的事务)传递给我的新通知类并从那里开始工作。当我使用这个 pdo 句柄插入行、回滚并从通知类退出脚本时,插入的行会粘在数据库中(即不回滚)。我确认在原类中使用相同pdo句柄插入的数据成功回滚。我想我会尝试在通知类中启动一个事务(尽管这对于应用程序的结构来说并不理想),但我得到了一个 PDOException 'There is already a active transaction'。

我不想(也不认为我需要)显示太多代码,但这就是正在发生的事情。爬行.php

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

通知.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;
}

更新 1 我尝试查询 'SET autocommit=0' 然后 'ROLLBACK' 但我得到了相同的结果。

更新 2 我使用以下代码检查通知类是否在事务中,并且毫不奇怪地输出“事务中”。

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

更新 3 最终更新,希望如此。从 notification.php 发出的 PDO 查询插入到不同的 InnoDB 表中。这会是个问题吗?

有任何想法吗?

4

1 回答 1

0

我一直在升级我的数据库结构并重写了很多后端代码,并且忘记将通知表从 MyISAM 更改为 InnoDB。感谢 BenjaminPaap 的帮助/兴趣。

抱歉浪费了问题。

于 2012-12-06T21:48:18.470 回答