Php 如何在MySQL中检测隐式提交?
我想知道是否有可能检测到由隐式提交或否导致的中断事务。 目前,我不知道如何在没有隐式提交的情况下检查应用程序中的事务是否工作。此外,我看不出我的更改是否不会导致隐式提交 看起来控制它的最简单方法是强制MySQL抛出错误,而不是隐式提交,但我不知道如何配置它 有时很难在代码中看到问题,所以MySQL错误可能是保护事务的有效方法 下面的示例将显示可以隐藏多少隐式提交 使用隐式提交的代码:Php 如何在MySQL中检测隐式提交?,php,mysql,transactions,commit,implicit,Php,Mysql,Transactions,Commit,Implicit,我想知道是否有可能检测到由隐式提交或否导致的中断事务。 目前,我不知道如何在没有隐式提交的情况下检查应用程序中的事务是否工作。此外,我看不出我的更改是否不会导致隐式提交 看起来控制它的最简单方法是强制MySQL抛出错误,而不是隐式提交,但我不知道如何配置它 有时很难在代码中看到问题,所以MySQL错误可能是保护事务的有效方法 下面的示例将显示可以隐藏多少隐式提交 使用隐式提交的代码: public function loadDataToDb(XMLReader $productXML) {
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()时,它创建了一个存储对象,该对象在它的_构造函数中执行截断。所以事务被破坏了,不进行调试就无法检测到它
在这种情况下,pdo异常将非常有用。如果在正常异常之前使用另一个catch块并捕获pdo异常
public function loadDataToDb(XMLReader $productXML)
{
$this->stats=$this->getProductImporter()->initStats();
$storage=$this->getStorage()
}不存在pdo异常
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);
}
}
}