ako zabespecit transakciu nad viacerimi modelmi?

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

Caute, Ako riesite zabespecenie transakcie ked pracujete nad viacerimi modelmi? Napr. ked mam presenter, alebo control, a potrebujem pracovat s viacerimi modelmi, ale aby to bolo trasnakcne, kedze kazdy model je samostatne.

$productEntity = $this->productRepository->add($values);
$this->productItemRepository->add($productEntity->id, $productItems);
$this->productImageRepository->add($productEntity->id, $productImage);

Editoval duskohu (2. 3. 2013 13:48)

castamir
Člen | 629
+
0
-

Je to otázka návrhu aplikace. Popíši zde, jak to řeším já, nicméně není to dogma. Můžeš si najít své řešení, které ti bude lépe vyhovovat.

U mě je model obecně nějaká vrstva pro správu dat. V rámci modelu rozlišuji několik úrovní abstrakce.

  • mapper – vrstva pro praci s daty (databáze, xml, apod). Jednotlivé typy mapperů (např. pro databázi) mají stejné rozhraní.
  • repository – vrstva pro práci nad skupinou dat (např databázová tabulka). Používá mapper pro zajištění operací, ale jeho vnitřní implementace ho nezajímá. Je vůči repository skrytá.
  • facade (fasáda) – vrstva, která zajišťuje aplikační logiku. Přistupuje k různým repository a zpracovává data. Zde nejčastěji používám rozhraní pro transakce.

Presenter pak zpracovává data poskytnutá z fasád…

Editoval castamir (2. 3. 2013 14:08)

Nox
Člen | 378
+
0
-

Co v tomto případě myslíš jako „transakční“? Z toho kódu mi to není jasné

castamir
Člen | 629
+
0
-

@Nox nejspíš to chce obalit do jedné transakce např. v PDO příkazy beginTransancion(), commit() případně rollback()

duskohu
Člen | 778
+
0
-

@castamir to vystihol, chcem to zabalit do jednej transakcie.

Nox
Člen | 378
+
0
-

Ok, tak to asi řeší co jsi napsal (ale pokud je mapper xml, tak se asi transakce neuplatní … nepočítá tu tedy ta fasáda s určitou implementací? Nebo to chápu špatně?).

Pokud by ta fasáda používala zas jinou část modelu … myslim, že už se tu „vnořené“ transakce taky řešily (dle implementace i counterem … pokud vim tak třeba MySQL bohužel vnořené transakce nepodporuje)

castamir
Člen | 629
+
0
-

@Nox: Mám obecné rozhraní pro mapper a jeho nástavbu v podobě databaseMapperu, který má navíc transakce. Pokud to chceš sjednotit, tak by bylo potřeba do xmlMapperu dodělat patřičné operace.