Domanda

Sto cercando di raggiungere un qualche tipo di comportamento transazione nidificata utilizzando il controllo delle transazioni di NHibernate e opzioni FlushMode, ma le cose sono un po 'di confusione dopo troppa lettura, in modo che qualsiasi conferma sui fatti che elenco qui sotto sarà molto utile.

Quello che voglio è quello di aprire una grande operazione che si divide in piccole transazioni. Immaginate il seguente scenario:

  • TX1 apre un TX e gli inserti record di una persona;
  • TX2 apre un TX e aggiorna il nome di questa persona alla P2;
  • commit TX2;
  • TX3 apre un TX e aggiorna il nome di questa persona alla P3;
  • rollback TX3;
  • commit TX1;

Mi piacerebbe vedere NH invio del INSERT e UPDATE TX2 al database, semplicemente ignorando ciò che TX3, come è stato eseguito il rollback.

Ho cercato di usare FlushMode = Mai e solo vampate di calore la sessione dopo il corretto Begins / impegna / ripristini sono stati richiesti, ma NH aggiornare sempre il database con stato finale dell'oggetto, indipendentemente commit e rollback. È normale? Fa NH ignora davvero il controllo transazionale quando si lavora con FlushMode = Mai?

Ho anche cercato di usare FlushMode = Commit e openning le transazioni nidificate, ma ho scoperto che, a causa ADO.NET, le transazioni nidificate sono, in realtà, sempre la stessa transazione.

Si noti che non sto cercando di ottenere un comportamento "tutto o niente". Sto cercando di più per un modo punto di salvataggio di lavoro. C'è un modo per farlo (punti di salvataggio) con NH?

Grazie in anticipo.

Filipe

È stato utile?

Soluzione

Giusto per non lasciare aperta la questione per sempre, vi posterò la soluzione che abbiamo adottato.

Abbiamo un'unità di lavoro come contenitore che gestisce il comportamento delle transazioni nidificato. A seconda del tipo di trattamento che vogliamo, si crea (o no) le nuove sessioni. Con l'esempio:

  • Continua in caso di errore: se vogliamo che, anche se su un errore di transazione gli altri commit, il contenitore UoW utilizza diverse sessioni per ogni "operazione" e svuota ogni tx alla fine del suo lavoro;
  • Rollback in caso di errore: se vogliamo che su un rollback di sessione (a causa di un errore o di un business rollback) ogni altra operazione viene rollback, il contenitore UoW utilizza la stessa sessione per tutte le transazioni nidificate e rollback tutti in la fine.

E 'importante dire che l' "operazione" che questa manipola UOW non è l'NH (ADO.NET) di transazione direttamente. Abbiamo creato un'astrazione di una transazione in modo che il codice di manipolazione "voti" se la nostra transazione potrebbe essere commesso o il rollback, ma la vera azione appena si verifica alla fine di tutto, sulla base della strategia di errore selezionato.

Sappiamo che questo utilizzo non è molto comune e solo si adatta a scenari specifici (nel nostro caso si tratta di uno scenario di integrazione con l'elaborazione in batch), quindi mi codice postale ora. Se qualcuno pensa che questa implementazione può aiutare, per favore, mandatemi un messaggio e sarò felice di condividere il codice.

Saluti,

Filipe

Altri suggerimenti

NHibernate non supporta le transazioni nidificate. Ogni ISession può avere al massimo una transazione attiva. Non sono sicuro di quello che si; re cercando di realizzare perché il vostro scenario di esempio non ha senso per me. Commettere transazione 1 dopo l'inserimento avrebbe lo stesso effetto.

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