2014-02-19 4 views
2

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

답변

0

일반적인 예외 앞에 다른 catch 블록을 사용하고 PDO 예외를 잡으면?

public function loadDataToDb(XMLReader $productXML) 

{$ this-> 통계 = $ 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); 
     } 
    } 
} 

}

+0

는 PDO 예외가 아니다 – user3328160

관련 문제