13 komentářů k článku Doctrine 2:stavy entit a transakce:

  1. Cechjos

    Re: Doctrine 2:stavy entit a transakce

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

    1. Jan TichýAutor příspěvku

      Re: Doctrine 2:stavy entit a transakce

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

      1. Cechjos

        Re: Doctrine 2:stavy entit a transakce

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

        1. Jan TichýAutor příspěvku

          Re: Doctrine 2:stavy entit a transakce

          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.

  2. Tomas

    Generovanie entit z databaze

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

      1. Tomas

        Re: Generovanie entit z databaze

        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

      1. sebastiano19

        Re: Generovanie entit z databaze

        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 UsersModuleEn­titiesAuthdri­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

        1. Jan TichýAutor příspěvku

          Re: Generovanie entit z databaze

          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.

          1. Lenka

            Re: Generovanie entit z databaze
            Dobrý den, jde ječte to načtení entit z databáze již vytvořené?jsem začátečník s Doctrine, takže jsem ráda za každou radu

  3. stefano

    Uzamykanie riadkov tabuľky

    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.

    1. drevolution

      Re: Uzamykanie riadkov tabuľky

      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.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=3322