2011-05-03 3 views
1

Symfony로 Doctrine을 사용하여 여러 모델/테이블에서 특정 작업 집합을 수행하려고합니다. 여기에 내가 뭘하는지입니다 : 그러나Symfony/Doctrine : 여러 객체/함수가 포함 된 트랜잭션

public function myFunc() 
{ 
     $conn = Doctrine_Manager::connection(); 
     try { 
      $conn->beginTransaction(); 
      $prop_trans->save($conn); 
      self::doSomething1($conn); 
      $bill_appor->save($conn); 
      // Final Committ 
      $conn->commit(); 
      return $prop_trans; 
     } catch (Exception $exc) { 
      if ($conn) 
       $conn->rollback(); 
      throw $exc; 
     } 
} 

public function doSomething($conn) 
{ 
     $obj = new Trans(); 
     // this function might create & save another child record 
     $obj->doSomething2($conn); 
     $obj->save($conn); 

} 

예외 (코드 또는 데시벨 수준)이있을 때, 나는 어떤 기록이 저장되는 것을 볼로 롤백이 작동하는지 궁금합니다.

필자는 연결을 열고 트랜잭션을 시작한 후 연결 $ conn을 사용하는 모든 메서드가 동일한 트랜잭션에서 실행되고 있음을 이해합니다. 무언가가 실패하면 모두 롤백합니다.

세이브 포인트를 사용해 보았지만 작동하지 못했습니다. 연결을 전달하면 모든 것이 트랜잭션을 실행하기에 충분하다는 것을 다른 사람이 알려줄 수 있습니까? MySQL auto_committ 속성이 설정 되었기 때문입니까? 감사합니다.

+0

코드는 더 많거나 적은 의사 코드, 그래서 PL 오류를 무시, 정적으로 호출되는 객체 메소드와 같은 것 – Prasad

답변

2

트랜잭션은 InnoDB 테이블을 통해서만 지원되며, 일부 테이블은 MyISAM입니다. 따라서 롤백은 InnoDB에서만 작동하며 MyISAM에 대한 변경 사항은 그대로 유지됩니다.

+0

감사합니다. 모든 테이블이 InnoDB인지 확인했지만 어떻게 든 데이터베이스는 MyISAM입니다. DB 유형은 어떻게 변경합니까? databases.yml? 그것은 doctrine에 의해 생성 되었기 때문에 : build-db 태스크. 다시 한 번 감사드립니다 – Prasad

+0

@Prasad 귀하의 데이터베이스가 innodb임을 어떻게 알 수 있습니까? 그러한 정의는 없습니다. 데이터베이스에는 ENGINE 자체가 없습니다. –

+0

감사합니다. FractalizeR. PHPMyAdmin (MySQL 용)에서 DB 요약을 확인했습니다. 각 테이블의 "Type"은 InnoDB이다. 요약 행에는 "15 개 테이블"이 표시되고 다음 열에는 "MyIsam"이 표시됩니다. 그러나 또 다시 롤백이 예상대로 작동하지 않는 다른 이유가 있습니까? 거래/연결에 묶여 있지 않습니까? – Prasad

1

단지뿐만 아니라 다른 기능에 시도의 ctach에

또는 단지 넣어 시도 캐치를

catch (Exception $exc) { 

       $conn->rollback(); 

     } 

을 시도

관련 문제