2012-12-12 2 views

답변

21

설명서가 누락되었습니다.

무슨 일이 있었는지 확인하려면 Zend \ Db \ Adapter의 API docs으로 들어가야했습니다.

Zend\Db\Adapter\Driver\ConnectionInterface에 정의 된대로 , rollbackcommit이 정의됩니다. 즉, 모든 단일 어댑터 연결에서 호출 할 수있는 메서드입니다. 불행히도 연결 자체가 오히려 묻혀 있습니다.

내가 분명하지는 않지만 현재 예제를 제공 할 수없는 것은 실제로이 메소드를 호출하는 객체를 파악하는 것입니다. 최악의 경우 $adapter->getDriver()->getConnection()->beginTransaction()에 전화하는 것이 좋습니다.

Eww.

나는 더 많은 지식을 가진 다른 사람과 ZF2 복사본을 편리하게 볼 수 있기를 기대하며 더 나은 옵션을 제공 할 것입니다.

직접 BEGIN TRANSACTION/ROLLBACK/COMMIT/SET autocommit=... 개의 SQL 문을 직접 발행 할 수 있다는 것을 잊지 마십시오. 이것은 아마도입니다. Zend \ Db는 트랜잭션 상태를 추적합니다.

+0

많은 분들께 감사드립니다. Charles - API를 통해 신중하게 읽고 API를 읽어야합니다. 마지막 지점에서 직접 PDO를 통해 문제를 해결해야합니다. –

35

당신이 가지고 있습니다. 적절한 방법은, 시작 커밋, 다음과 같이 롤백 거래되는 : 당신이 사용하는 경우

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue() 

:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 

$this->getAdapter()->getDriver()->getConnection()->commit(); 

$this->getAdapter()->getDriver()->getConnection()->rollback(); 

그냥 너무 당신은 또한에 의해 생성 된 마지막 ID를 얻을 수있다이를 넣어 pgSQL 생성 된 마지막 ID를 반환하기 위해 시퀀스를 추가해야합니다 :

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq') 
+2

감사합니다 @Diemuzi - 이것은 정말로 유용합니다. –

+0

위대한, 잘 설명, 많은 감사 !! ZF2 및 ZF3의 문서는이 부분에 대해 명확하지 않습니다! – evilReiko

8

트랜잭션을 수행 할 때 두 가지 사항이 있습니다.
1 - MyISAM은 트랜잭션 엔진이 아니기 때문에 테이블 엔진을 InnoDB로 변경한다.
2 - 트랜잭션 쿼리 ("START TRANSACTION;" OR "ROLLBACK;") 연결은 다른 쿼리 (삽입 또는 업데이트)와 동일해야합니다.
ZF2에서이를 수행하려면 현재 db 어댑터를 가져와 모든 쿼리에서 사용해야합니다.

이 코드 제대로 작동하지 않습니다 : $this->getAdapter()->getDriver()->getConnection() 이후

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $this->getAdapter()->getDriver()->getConnection()->rollback(); 

새로운 DB 연결을 작성합니다.대신

를 사용하여 다음 코드를 사용자의 연결이 올바른지 확인을 위해

$connection = $this->getAdapter()->getDriver()->getConnection(); 
    $connection->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $connection->rollback(); 

, 그냥 MySQL의 쿼리 로그를 할 수 있습니다.
쿼리를 실행 한 후에는 mysql 로그의 각 쿼리 앞에 연결 번호가 표시됩니다. 모든 트랜잭션 쿼리에서 동일해야합니다.