Sto discutendo di questo con me stesso. L'ISession di NHibernate offre un'unità di lavoro corretta e corretta se utilizzata senza una transazione? In assenza di una transazione, ogni comando SQL viene incapsulato dal server del database in una transazione diversa. Quindi c'è ancora una possibilità che in un batch di 10 comandi SQL (svuotati dallo stesso oggetto di sessione), 7 siano impegnati, l'ottavo si incontra e l'errore e il resto (incluso l'8) non finisce mai.
La stessa cosa accade se FlushMode.Auto viene utilizzato senza una transazione di accompagnamento e una query costringe tutte le entità dirty a essere scaricate nel database. Dopo questo punto, se l'applicazione ha generato un'eccezione, tutte le modifiche precedentemente scaricate dovrebbero essere ripristinate, ma non lo sarebbero.
IMO, abbiamo quasi sempre bisogno di implementare il lavoro di lavoro unitario facendo uso della transazione insieme alle sessioni.