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:
- Všechny insert nových entit.
- Všechny update jednotlivých již persistovaných entit.
- Všechny hromadné delete celých kolekcí.
- Všechny hromadné update celých kolekcí.
- 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().