Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Doctrine 2:stavy entit a transakce

Josef Čech
9. 9. 2010 11:18 Nový

Re: Doctrine 2:stavy entit a transakce

celé vlákno

Dobrý den, měl bych „dotaz“ k následující části:

„…občas to ale bohužel vede k vyloženě nešťastnému a nečekanému chování, se kterým je potřeba počítat.“

Nebyl by nějaký konkrétní příklad neočekávaného chování, na který jste při používání Doctrine2 UnitOfWork narazil?

Jinak díky za pěkný seriál. .)

Jan Tichý aura:21
9. 9. 2010 14:32 Nový

Re: Doctrine 2:stavy entit a transakce

celé vlákno

UnitOfWork neprovádí dotazy v takovém pořadí, v jakém přišly, ale přeskupuje si je podle svého uvážení. Což je na jednu stranu fajn, protože to má pozitivní vliv na výkon. Na druhou stranu ale občas může na pořadí záležet a pokud se přeskupí, dostane se úplně jiný výsledek. Například když udělám:

INSERT INTO article (id) VALUES (1);
DELETE FROM article;

tak to samozřejmě dopadne úplně jinak, než když udělám:

DELETE FROM article;
INSERT INTO article (id) VALUES (1);

Pak je potřeba počítat s tím, že Doctrine 2 provádí po zavolání flush() jednotlivé aktualizace v následujícím pořadi:

  1. Všechny insert nových entit.
  2. Všechny update jednotlivých již persistovaných entit.
  3. Všechny hromadné delete celých kolekcí.
  4. Všechny hromadné update celých kolekcí.
  5. Všechny delete jednotlivých již persistovaných entit.

Takže ať bych napsal výše uvedený příklad v jakémkoliv pořadí, vždycky se nakonec provede ve své první podobě, tabulka s články bude tedy nakonec zcela prázdná.

Pokud by to někomu v konkrétní situaci opravdu vadilo, nezbývá, než si manuálně otevřít transakci a provést v rámci ní více sad změn a každou vždy potvrdit pomocí samostatného  flush().

Josef Čech
9. 9. 2010 15:17 Nový

Re: Doctrine 2:stavy entit a transakce

celé vlákno

Díky za odpověď; myslel jsem, že mj. právě o správné pořadí dotazů by se měl Unit of Work starat.

Jan Tichý aura:21
11. 9. 2010 21:56 Nový

Re: Doctrine 2:stavy entit a transakce

celé vlákno

On se o to pořadí stará. Občas ale prostě nelze objektivně určit, které pořadí je to správné, protože kritérií na „správnost“ může být více a mohou jít i proti sobě. Takže Doctrine 2 to aktuálně dělá tak, jak jsem popsal, což je asi lepší z hlediska výkonu, méně dobré je to v některých okrajových případech z hlediska „logiky“. I já osobně nepovažuji současné řešení za šťastné, ale jak říkám – na to není objektivní odpověď a z několika srovnatelných možností to Doctrine 2 prostě dělá zrovna takhle.

Tomas
Tomas (neregistrovaný) ---.kn.vutbr.cz
11. 9. 2010 16:08 Nový

Generovanie entit z databaze

celé vlákno

Dobry den.
Je mozne vygenerovat entity ak uz mam databazu? Aby som nemusel definovat entity pre tu spustu tabuliek :-)

Vít Šesták (v6ak) aura:72
11. 9. 2010 16:13 Nový

Re: Generovanie entit z databaze

celé vlákno

Asi to půjde, stačilo krátce pohledat: http://www.doctrine-project.org/documentation/manual/2_0/en/introduction
Ale může se samozřejmě stát, že vygenerované entity nebudou úplně ono. Záleží to na konkrétním příkladě.

Tomas
Tomas (neregistrovaný) ---.kn.vutbr.cz
11. 9. 2010 16:42 Nový

Re: Generovanie entit z databaze

celé vlákno

tam som hladal, ale ak myslis ORM:generate-entities, tak tam pisu, ze generuje entity z mapovacich informacii, takze predpokladam, ze to nebude priamo z DB, takze si musim nadefinovat xml alebo yaml, ak to teda dobre chapem

Jan Tichý aura:21
11. 9. 2010 21:53 Nový

Re: Generovanie entit z databaze

celé vlákno

Ano, je to možné. Nejlepší bude odkaz přímo do dokumentace – http://www.doctrine-project.org/projects/orm/2.0/docs/reference/tools/en#reverse-engineering

Tomáš Bajzecer aura:45
12. 9. 2010 19:53 Nový

Re: Generovanie entit z databaze

celé vlákno

Super, dakujem. Mam este jeden problem. Mam tabulku „users“ (PK:id_user), na ktoru robim JOIN tabulky „auths“, ktora ma kompozitny PK (PK:id_driver,lo­ginname FK:id_user FK:id_driver), co je v pohode. Ale v tom istom dotaze chcem spravit JOIN aj na „auths“ a viazana tabulka je authdrivers (PK:id_driver), kde mi doctrine zahlasi: Exception: Single id is not allowed on composite primary key in entity UsersModule\En­tities\Authdri­ver.
Neviem, kde moze byt chyba, asi to zle chapem…
blizsi popis problemu: http://forum.nette.org/cs/5291-doctrine-2-join-na-tabulku-s-kompozitnym-pk

Jan Tichý aura:21
12. 9. 2010 20:00 Nový

Re: Generovanie entit z databaze

celé vlákno

Doctrine 2 měla dlouhodobě problémy s takovými kombinacemi kompozitních klíčů. Spoustu toho už před nedávnem opravili, některé kombinace ale tuším ještě zůstaly nefunkční. Neumím teď takhle z hlavy říct, jestli zrovna tohle je ten stále nefunkční případ, k otestování bych potřeboval kompletní kód. Pojďme ale pokračování téhle diskuze přesunout přímo do odkazovaného Nette fóra, kde to snad vyřešíme až do konce.

stefano
stefano (neregistrovaný) ---.juko.po.cust.gts.sk
18. 9. 2010 21:19 Nový

Uzamykanie riadkov tabuľky

celé vlákno

Používa entity manager pri spracovaní transakcie zámky na načítané záznamy????
Ide o to či sa viacero súčasných procesov nad jedným záznamom nepobije.

Václav Novotný
20. 9. 2010 10:41 Nový

Re: Uzamykanie riadkov tabuľky

celé vlákno

Tohle je věc, kterou si musí každý databázový systém řešit nejlépe sám. PostgreSQL to řeší přes MVCC (http://wiki.postgresql.org/wiki/MVCC), MySQL to na InnoDB řeší AFAIK pomocí zamykání tabulek. Jak je to implementované nad MyISAM netuším. Oracle IMHO transakce podporuje stejně jako PostgreSQL. Záleží tedy, jaký databázi používáte.

Zasílat nově přidané příspěvky e-mailem