2012-12-12 18 views

Odpowiedz

21

Brakująca dokumentacja jest ciekawa.

Aby dowiedzieć się, co się stało, musiałem zanurkować w API docs dla Zend \ Db \ Adapter.

Wygląda na to, że beginTransaction, rollback i commit są zdefiniowane w Zend\Db\Adapter\Driver\ConnectionInterface. Oznacza to, że są to metody wywoływalne dla każdego połączenia adaptera. Niestety samo połączenie jest raczej pochowane.

To, czego nie jestem pewien - i nie mogę podać przykładu w tym momencie - polega na określeniu, który obiekt faktycznie wywołuje się tymi metodami. W najgorszym przypadku wygląda na to, że możesz zadzwonić pod numer $adapter->getDriver()->getConnection()->beginTransaction().

Eww.

Mam nadzieję, że ktoś inny z większą wiedzą i kopią ZF2 pod ręką, zobaczy to i zapewni lepszą opcję.

nie należy zapominać, że można po prostu wydawać oświadczenia BEGIN TRANSACTION/ROLLBACK/COMMIT/SET autocommit=... SQL samodzielnie. To jest prawdopodobnie OK, ponieważ nie wygląda na to, że Zend \ Db śledzi stan transakcji.

+0

Wielkie dzięki Charles - Będę musiał przeczytać i uważnie przeczytać API, na twoim ostatnim punkcie, aby je wydać bezpośrednio, będę pracował poprzez PDO, aby to zrobić. –

35

Masz to. Właściwym sposobem, aby rozpocząć, Commit i Transakcje wycofania zmian przedstawia się następująco:

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

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

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

Wystarczy umieścić to tam też można również uzyskać ostatni identyfikator utworzony przez:

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

Jeśli używasz pgSQL należy dodać sekwencję, aby zwrócić ostatni utworzony identyfikator:

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

Dzięki @Diemuzi - to naprawdę przydatne. –

+0

To wspaniałe, dobrze wyjaśnione, wielkie dzięki! Dokumenty ZF2 i ZF3 nie są jasne o tej części! – evilReiko

8

Są dwie rzeczy do przeprowadzenia transakcji.
1 - MyISAM nie jest mechanizmem transakcyjnym, dlatego zmień silnik tabeli na InnoDB.
2 - Zapytanie o transakcję ("START TRANSACTION;" OR "ROLLBACK;") musi być takie samo w przypadku innych zapytań (wstawianie lub aktualizowanie).
Aby to zrobić w ZF2, powinieneś pobrać aktualny adapter db i używać go we wszystkich zapytaniach.

Ten kod nie będzie działać poprawnie:

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

Od $this->getAdapter()->getDriver()->getConnection() Tworzy nowe połączenie DB.

Użyj następującego kodu:

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

Aby sprawdzić, czy połączenie jest poprawne, tylko włączyć dziennik zapytań w MySQL.
Po uruchomieniu zapytania zobaczysz numer połączenia przed każdym zapytaniem w logu mysql. Musi być taki sam we wszystkich kwerendach transakcyjnych.