Jest możliwe (nawet prawdopodobne), że po prostu nie w pełni pogrążam pojęcie "jednostki pracy". Zasadniczo uważam to za rodzaj szerokiej transakcji wykorzystywanej w środowisku obiektowym. Uruchom jednostkę pracy, interakcję z obiektami, zatwierdzenie lub wycofanie. Ale w jaki sposób rozkłada się to na rzeczywiste transakcje w magazynach danych znajdujących się za tymi obiektami?Jednostka pracy z wieloma źródłami danych?
W systemie z pojedynczym DB i ORM (np. NHibernate) jest to łatwe. Transakcja może zostać utrzymana za pośrednictwem ORM. Ale co z systemem, w którym niestandardowe modele domen zasłaniają wiele różnych źródeł danych? I nie wszystkie z tych źródeł danych są relacyjnymi bazami danych? (Tutaj dużo się dzieje w systemie plików.)
W tej chwili utknąłem na idei, że "po prostu nie można utrzymywać transakcji przez DB SQL DB2, DB SQL2000, DB2 DB, i system plików w tej samej "atomowej" operacji biznesowej. " Na razie to odpowiedzialność deweloperów w zespole (którzy generalnie pracują niezależnie od siebie) w celu utrzymania transakcji ręcznie w kodzie. Każdy DB może mieć na nim odpowiednie transakcje, ale operacja biznesowa jako całość jest ręcznie sprawdzana i równoważona na każdym znaczącym etapie.
Jednak wraz ze wzrastającą złożonością domeny i standardowymi obrotami deweloperów, podejście to stanie się coraz bardziej trudne i podatne na błędy w miarę upływu czasu.
Czy ktoś ma jakieś porady lub przykłady tego, jak najlepiej rozwiązać tę domenę lub w jaki sposób adresowano ją wcześniej? Faktyczna "domena" w tym przypadku jest w dalszym ciągu bardzo wczesna, ewoluując jako prototyp do pewnego dnia rozszerzania i konsumowania/zastępowania dużego ekosystemu odmiennych starszych aplikacji. Jest więc dużo miejsca na przeprojektowanie i re-factoring.
Dla porównania, projekt, o którym obecnie myślę, to 10 000 stóp to: Duża kolekcja małych, tak nieistotnych aplikacji klienckich, które wywołują centralną usługę opartą na wiadomościach. Usługa jest wejściem do "rdzenia domeny" i może być uważana za jedną dużą aplikację w stylu MVC. Wnioski są składane do usługi (podobnie jak "działania"), które są odbierane przez procedury obsługi (podobnie jak "kontrolery"). Wszystko, co proceduralne idzie tam. Komunikują się z modelami, które zawierają wszystkie reguły biznesowe. Modele publikują zdarzenia, które nasi słuchacze ("usługi" - ta część jest wciąż pochmurna w projekcie i podlega ulepszeniom) przechwytują i obsługują, wchodząc w interakcje z repozytoriami (baza x, baza danych y, system plików, poczta e-mail, dowolny zasób zewnętrzny). Wszystkie radosne uzależnienia - odpowiednio wstrzyknięto.
Przepraszam za wszystkie gadatliwość :) Ale jeśli ktoś ma jakąkolwiek radę, bardzo bym to usłyszał. Nawet (szczególnie) jeśli ta rada jest "twój projekt jest zły, spróbuj tego zamiast ..." Dzięki!
Czy w ogóle zajrzałeś do Koordynatora transakcji rozproszonych? http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx –
@Michael - Miałem szczęście używać TransactionScope/MSDTC z rozwiązaniami tylko SqlServer. Rozciąganie się w systemie plików i innych systemach RDBMS może być trudniejsze. OP mówi o koordynacji pracy nad różnymi silnikami baz danych, dlatego nie sugeruję, że MSDTC jest odpowiedzią. –