Old thread, but I have attempted a solution. It is only meant as a basis for discussion right now.
https://github.com/gliljas/nhibernate-core/tree/NH-3508 2013-08-06 15:42 GMT+02:00 Juan Carlos Correa <[email protected]>: > > Hello all, > > On this scenario I simulate a series of WCF calls to NHibernate > (OneSessionPerWCFCall). A total of 4 sessions are opened, 3 of them are in > one transaction scope that at the end is supposed to rollback. The last one > is in another transaction scope and gathers data from the 2nd level cache > that was not correctly updated after rollback. > > [TestMethod] > public void CacheTest() { > // create transaction (rollback at the end) > var comments = Guid.NewGuid().ToString("N"); > using (new TransactionScope(TransactionScopeOption.Required, new > TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { > // request #1 - load > // open another session to force using 2nd level cache values > using (var session = MasterSessionFactory.OpenSession()) { > // create tx > using (var transaction = session.BeginTransaction()) { > // reload version > var entity = session.Get<SpecificVehicle>(358); > // assert > Assert.IsNotNull(entity); > // commit > transaction.Commit(); > } > } > // request #2 - publish > // open another session to force using 2nd level cache values > using (var session = MasterSessionFactory.OpenSession()) { > // create tx > using (var transaction = session.BeginTransaction()) { > // reload > var entity = session.Load<SpecificVehicle>(358); > // update > entity.Comments = comments; > // commit > transaction.Commit(); > } > } > // request #3 - reload > // open another session to force using 2nd level cache values > using (var session = MasterSessionFactory.OpenSession()) { > // create tx > using (var transaction = session.BeginTransaction()) { > // reload version > var entity = session.Get<SpecificVehicle>(358); > // assert > Assert.IsTrue(entity.Comments == comments, "The property was not updated"); > // commit > transaction.Commit(); > } > } > } > // request #4 - load after rollback > using (new TransactionScope(TransactionScopeOption.Required, new > TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { > // open another session to force using 2nd level cache values > using (var session = MasterSessionFactory.OpenSession()) { > // create tx > using (var transaction = session.BeginTransaction()) { > // reload version > var entity = session.Get<SpecificVehicle>(358); > // assert > Assert.IsTrue(entity.Comments != comments, "The property was updated after > rollback"); // THIS ASSERTION FAILS > // commit > transaction.Commit(); > } > } > } > } > > Here are listed the NHibernate profiler screen shots in order per opened > session. > Session 1 > > > <https://lh3.googleusercontent.com/-0E2Y0uPFgjI/UgD6tXs1FTI/AAAAAAAAAXE/9OUFnmgutmU/s1600/Session+1.PNG> > Session 2 > > > > <https://lh3.googleusercontent.com/-j0Y140xNCCk/UgD69YbZpZI/AAAAAAAAAXM/V9Rwam3Z8ts/s1600/Session+2.PNG> > > > Session 3 > > > <https://lh3.googleusercontent.com/-2zEssnSR11A/UgD7OdVZFzI/AAAAAAAAAXU/44BVfGxHIZQ/s1600/Session+3.PNG> > > Session 4 > > > > <https://lh3.googleusercontent.com/-fj688Q1v4ac/UgD7bmTMQPI/AAAAAAAAAXc/epFXf8M15zw/s1600/Session+4.PNG> > > > The second level cache works properly as can be seen in the NH profiler, > but when the first transaction scope is disposed it rolls back changes from > all the inner transactions it contains, but still for the new scope which > get the values from the cache, values where not rolled back. > > > > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/d/optout.
