如何在MySQL中检测隐式提交?

时间:2014-02-19 13:43:15

标签: php mysql transactions commit implicit

我想知道是否可以检测由隐式提交或否造成的已损坏事务。 目前我不知道如何在没有隐式提交的情况下检查我的应用程序中的事务是否有效。此外,我无法看到我的更改是否导致隐式提交。

看起来控制它的最简单方法是强制MySQL抛出错误而不是隐式提交,但我不知道如何配置它。

有时很难在代码中看到问题,因此MySQL错误可能是保护事务的有效方法。

下面的示例将显示可以隐藏多少隐式提交。

带隐式提交的代码:

public function loadDataToDb(XMLReader $productXML)
{
    $this->stats = $this->getProductImporter()->initStats();

    while ($productXML->read()) {

        if ($productXML->nodeType == XMLReader::ELEMENT && $productXML->name == 'product') {
            $doc = new DOMDocument('1.0', 'UTF-8');
            $product = simplexml_import_dom($doc->importNode($productXML->expand(), true));
            $this->getDBConnection()->beginTransaction();
            try {
                $this->getStorage()->addProduct($product);
                $this->getDBConnection()->commit();
                $this->stats['valid_skus'][trim($product->sku)] = true;
            } catch (Exception $e) {
                $this->getDBConnection()->rollBack();
                $this->stats['invalid_skus'][trim($product->sku)] = true;
                $this->productLog('Product {' . $product->sku . '} skipped:' . $e);
            }
        }
    }
}

固定代码:

public function loadDataToDb(XMLReader $productXML)
{
    $this->stats = $this->getProductImporter()->initStats();
    $storage = $this->getStorage();

    while ($productXML->read()) {

        if ($productXML->nodeType == XMLReader::ELEMENT && $productXML->name == 'product') {
            $doc = new DOMDocument('1.0', 'UTF-8');
            $product = simplexml_import_dom($doc->importNode($productXML->expand(), true));
            $this->getDBConnection()->beginTransaction();
            try {
                $storage->addProduct($product);
                $this->getDBConnection()->commit();
                $this->stats['valid_skus'][trim($product->sku)] = true;
            } catch (Exception $e) {
                $this->getDBConnection()->rollBack();
                $this->stats['invalid_skus'][trim($product->sku)] = true;
                $this->productLog('Product {' . $product->sku . '} skipped:' . $e);
            }
        }
    }
}

说明:首次调用函数$ this-> getStorage()时,它会创建在其__constructor中执行截断的Storage对象。因此,事务被破坏,如果不进行调试就无法检测到它。

在这种情况下,pdo异常会有很大帮助。

1 个答案:

答案 0 :(得分:0)

如果在正常异常之前使用另一个catch块并捕获PDO异常?

public function loadDataToDb(XMLReader $productXML)

{     $ this-> stats = $ this-> getProductImporter() - > initStats();     $ storage = $ this-> getStorage();

while ($productXML->read()) {

    if ($productXML->nodeType == XMLReader::ELEMENT && $productXML->name == 'product') {
        $doc = new DOMDocument('1.0', 'UTF-8');
        $product = simplexml_import_dom($doc->importNode($productXML->expand(), true));
        $this->getDBConnection()->beginTransaction();
        try {
            $storage->addProduct($product);
            $this->getDBConnection()->commit();
            $this->stats['valid_skus'][trim($product->sku)] = true;
        } catch (PDOException $pdo) {
            $this->getDBConnection()->rollBack();
            $this->stats['invalid_skus'][trim($product->sku)] = true;
            $this->productLog('Product database error:  {' . $product->sku . '} skipped:' . $e);
        } catch (Exception $e) {
            $this->productLog('Product error:'. $e);
        }
    }
}

}