암시 적 커밋 또는 아니요로 인한 깨진 거래를 감지 할 수 있는지 알고 싶습니다. 현재 내 응용 프로그램의 트랜잭션이 암시 적 커밋없이 작동하는지 확인하는 방법을 알지 못합니다. 또한 내 변경 내용이 암시 적 커밋으로 이어지지 않는지 확인할 수 없습니다.MySQL에서 암시 적 커밋을 감지하는 방법은 무엇입니까?
제어하는 가장 쉬운 방법은 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 예외가 많은 도움이됩니다.
는 PDO 예외가 아니다 – user3328160