There is already an active transaction
- ondrej256
- Člen | 187
Zdravím,
je možné v nette/database nějak pracovat s transakcí v transakci?
vyhazuje mně to chybu
There is already an active transaction
Našel jsem řešení tady:
https://github.com/…nsaction_pdo
Ale umožňuje používat jen ručně psané sql příkazy pomocí metody exec()
- mcmatak
- Člen | 504
zanořené transakce jsou běžná věc, třeba modely co vkládají do databáze pomocí jiných modelů,
takze model A->insert()
logicky jelikož vkládá do dvou tabulek tak musí být v transakci
a pak model B->insert()
který také vkládá do dvou tabulek a ještě před tím ukládá model A, a máš tady zanořené transakce
- duke
- Člen | 650
Spousta databází umí tzv. savepointy, a vnořené transakce lze pomocí savepointů snadno emulovat. Obecně to lze realizovat např. rozšířením třídy PDO (viz tento článek), nicméně v Nette je PDO objekt vytvářen přímo, takže tady by se aktuálně nejspíš muselo jít cestou rozšíření třídy Nette\Database\Connection a napsání si vlastní Extension (protože Nette\Database\Connection se opět vytváří v DatabaseExtension přímo).
Možná by nebylo špatné, kdyby toto uměly řešit driver třídy z Nette\Database (např. skrz option „emulateNestedTransactions“), nebo kdyby šlo relevantní třídy alespoň snadněji nahradit vlastními rosřířenými třídami.
- norbe
- Backer | 405
Nepotřebuješ to vůbec rozšiřovat, viz můj předchozí příspěvek. K PDO se dostaneš velmi snadno. Pak už záleží jen na implementaci toho transaction manageru, jestli bude podporovat save pointy nebo ne..
- h4kuna
- Backer | 740
Toto rozšíření už mám delší dobu vytáhl jsem to a napsal na to testy. Je to obdoba toho co je popsáno výše. Umí to savepointy.