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