Podręcznik referencyjny ZF1 Zend_Db ma entire section z wykonywania transakcji.Jak działa Zend Db w transakcjach kontrolnych ZF2?
Brakuje dokumentacji dotyczącej transakcji.
Jak wykonać transakcje w ZF2? Przykładowy kod byłby pomocny.
Podręcznik referencyjny ZF1 Zend_Db ma entire section z wykonywania transakcji.Jak działa Zend Db w transakcjach kontrolnych ZF2?
Brakuje dokumentacji dotyczącej transakcji.
Jak wykonać transakcje w ZF2? Przykładowy kod byłby pomocny.
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.
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')
Dzięki @Diemuzi - to naprawdę przydatne. –
To wspaniałe, dobrze wyjaśnione, wielkie dzięki! Dokumenty ZF2 i ZF3 nie są jasne o tej części! – evilReiko
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.
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ć. –