Domanda

So che il sostegno doesnt NHibernate transazioni nidificate.

diciamo Let che ho ottenuto qualcosa di simile:

  1. UserService.BeginTransaction (sulla sessione corrente)
  2. UserService.Save
  3. UserService-> FeedService
    1. FeedService.BeginTransaction (sulla sessione corrente)
    2. FeedService.Save
    3. FeedService.Commit (sulla transazione restituito in # 3.1)
  4. UserService-> AddressService
    1. AddressService.BeginTransaction (sulla sessione corrente)
    2. AddressService.Save
    3. AddressService.Commit (sulla transazione restituito in # 4.1)
  5. UserService.Commit (sulla transazione restituito in # 1)

Che cosa succede quando commit viene richiamato a # 3.3, si impegna la transazione? Ho bisogno di tutto per avere successo o fallire sia.

È stato utile?

Soluzione

Come Jamie ha detto, le transazioni dovrebbe essere gestito a un livello superiore per evitare questa situazione.

Tuttavia, se si deve mantenere il iniziano / commit a livello "di servizio" per qualsiasi ragione, si potrebbe avvolgere tutto in un TransactionScope, che si Complete() solo dopo che tutto suceeds.

Altri suggerimenti

Sì. La chiamata BeginTransaction in 3.1 non farà nulla perché c'è già una transazione attiva. Se si desidera che tutte le operazioni di partecipare nella stessa transazione, allora non chiamare Begin / End transazione in 3.xe 4.x.

Il mio consiglio è di non usare le transazioni in servizio o classi repository. Mi sia controllare la transazione a livello di interfaccia utente o creare una classe che incapsula il processo di business.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top