There is already an active transaction

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondrej256
Člen | 187
+
0
-

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()

Myiyk
Člen | 321
+
0
-

Dle vlastní zkušenosti zanořovat transakce nejde. A nenapadá mě situace, kde by jsi potřeboval zanořovat transakce.

Můžeš se pochlubit, proč to potřebuješ.

mcmatak
Člen | 504
+
+2
-

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

David Grudl
Nette Core | 8238
+
0
-

Ona to musí v první řadě umět databáze a hodně databází to neumí.

norbe
Backer | 405
+
0
-

Celkem spokojeně využíváme následující: https://gist.github.com/…ecc112a7e531

duke
Člen | 650
+
0
-

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
+
0
-

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..

duke
Člen | 650
+
0
-

@norbe Jistě, můžeš jít na to i takto, ale mít to schované v Nette\Database\Connection (nejlépe přímo v rozšířeném PDO objektu, který by byl injektnut do Nette\Database\Connection) má své výhody. Mít to zvlášť je IMHO spíš workaround než čisté řešení.

h4kuna
Backer | 740
+
0
-

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.