Mam pytanie dotyczace wzorca UnitOfWork, który powinien gwarantować, że operacje wykonane wewnątrz bloku zostaną wykonane w całości lub w ogóle (atomość transakcja). Dobrą praktyką jest, aby obiekt unitofwork występował w service layer.
Zazwyczaj w EF (ze względu na to, że samo DBContext w EF jest swego rodzaju UnitOfWork) interfejs posiada pojedynczą metodę jest nią Commit() zatwierdzające transakcje. O ile takie rozwiązanie jest ok przy mało złożonych problemach (gdy pojedyncza akcja controllera generuje jeden zapis do bazy) - np. mamy OrderService z metodą Save(Order obj), obiekt jest zapisywany w repozytorium, transakcja jest commitowana.
Jak jednak rozwiązujęcie problem, gdy mamy np. wiele zagnieżdżony serwisów, które zapisują w repozytorium i gdy któraś się nie wykona - nie powinna wykonać się żadna. Podam dwa przykłady problemu.

a) Przykład pierwszy, na poziomie akcji kontrolera

public ActionResult Save() {
     OrderService.Save(obj);
     InnyService.Save(innyobj);
}

Serwisy te posiadają wstrzykniętą instancję unitofwork z cyklem życia PerHttpRequest, commitowanie następuje wewnątrz metody, po pomyslnym wykonaniu kodu. Chcemy aby była następująca zależność: jeżeli zapis do bazy w metodzie Save na InnyService nie wykona się (jakiś Exception), to zapis do bazy w metodzie obiektu OrderService też się nie powinien wykonać. Jednak takiej obsługi nie ma.

b) drugi przypadek na poziomie service layer:

public class OrderService : IOrderService {
public OrderService(IUnitOfWork uof, IRepository<Order> repository, IOtherService otherservice) {
 .....
 }
public void Save(Order order) {
  repository.Insert(order);
  var innyobj = .....
  otherservice.Save(innyobj);
  uof.Commit();
}
}
Ta sama sytuacja tylko zagnieżdżone serwisy, których metody są pojedynczymi transakcjami(commit występuje dwa razy - raz w metodzie 'Save' obiektu typu OrderService i raz w metodzie 'Save' obiektu typu OtherService)

Pierwszy co przychodzi na myśl:
a) obsługiwać zatwierdzenie transakcji w metodach Application_BeginRequest, Application_EndRequest Global.asax (takie podejście aktualnie stosuje - minusem jest, że każde zakończenie żądania http wywołuje commita, nawet jeżeli nie było operacji na bazie, więc jest on zbędny)
b) Wprowadzić metodę Begin() gdy rozpoczynamy transakcje , która zwiększa jakąś prywatną zmienną o 1. Oraz metoda Commit zmniejsza tą prywatną zmienną, a jeżeli jest=0 to dodatkwo następuje faktyczne zatwierdzenie transakcji)

Czy macie jakieś inne rozwiązania tego problemu? Lub jakieś uwagi do wymienionych przeze mnie?