Fabio, are you referring to the fact he assigns a string to b, instead of to b.Prop2? I noticed, but ignored that, and it was corrected in another mail. Or is there something else I'm missing?
/Oskar 2009/11/21 Fabio Maulo <[email protected]>: > Oskar, that code can't be compiled (try to compile it by eyes). > > 2009/11/20 Oskar Berggren <[email protected]> >> >> This is somewhat of a guess, but I suspect you will see the expected >> behavior if you replace Load with Get. Or don't commit sess1 until >> after you've modified b. >> >> Get fetches the object immediately, while Load returns a proxy, not >> loading the object until you first access one of it's properties. This >> should cause b to actually show the value committed in sess1, the way >> your code looks now. >> >> /Oskar >> >> >> 2009/11/20 Rémi Després-Smyth <[email protected]>: >> > Can anyone explain optimistic locking in the context of NHibernate? >> > (Using >> > NHib 2.1.1.) >> > >> > >> > >> > I’ve been running tests and my results are counter-intuitive. I have a >> > versioned entity: >> > >> > >> > >> > >> > >> > <class name="Test.Entity, Test" table="tblEntity" abstract="false" >> > optimistic-lock="version"> >> > >> > >> > >> > <id name="Id" column="scheduleId" access="property" >> > unsaved-value="0" >> > type="Int64"> >> > >> > <generator class="hilo"> >> > >> > <param name="table">tblHiloUId</param> >> > >> > <param name="column">nextHighValue</param> >> > >> > <param name="max_lo">100</param> >> > >> > </generator> >> > >> > </id> >> > >> > >> > >> > <version column="version" name="Version" type="Int32" >> > unsaved-value="0" /> >> > >> > >> > >> > <property name="Prop1" column="prop1" update="false" >> > >> > access="property" not-null="false" type="Boolean" >> > >> > optimistic-lock="true" /> >> > >> > >> > >> > <property name="Prop2" column="isDefaultOverridable" >> > >> > access="field" not-null="true" type="String" >> > >> > optimistic-lock="true" /> >> > >> > </class> >> > >> > >> > >> > And the following test: >> > >> > >> > >> > [Test, >> > ExpectedException(ExceptionType=typeof(StaleObjectStateException))] >> > >> > public void SavingUpdatesOptimisticLockShouldThrow() >> > >> > { >> > >> > var cfg = new NHibernate.Cfg.Configuration(); >> > >> > cfg.AddAssembly("Test"); >> > >> > cfg.Configure(); >> > >> > var sessionFactory = cfg.BuildSessionFactory(); >> > >> > >> > >> > var sess1 = sessionFactory.OpenSession(); >> > >> > var sess2 = sessionFactory.OpenSession(); >> > >> > >> > >> > sess1.BeginTransaction(); >> > >> > sess2.BeginTransaction(); >> > >> > >> > >> > // NOTE: I get the same results if I load with Lock.None >> > >> > // A record is loaded in the DB in test setup, assigned to m_Id >> > >> > var a = sess1.Load<Entity>(m_Id); >> > >> > var b = sess2.Load<Entity>(m_Id); >> > >> > >> > >> > a.Prop2 = "New test value, session1”; >> > >> > sess1.Save(a); >> > >> > sess1.Transaction.Commit(); >> > >> > >> > >> > b = "Another, session2"; >> > >> > sess2.Save(b); >> > >> > sess2.Transaction.Commit(); // Should throw? >> > >> > } >> > >> > >> > >> > After reading the docs, this is what I’d expect to see: >> > >> > >> > >> > Both instances start with version=1. When I save and commit a, I see >> > that >> > its version number is incremented from 1 to 2, while b still has >> > version=1 >> > (as I’d expect). I’d expect that the call to sess2.Transaction.Commit() >> > should throw, because NHibernate will determine that the record was >> > updated >> > since b was loaded, so optimistic concurrency issue. But it doesn’t – b >> > commits fine, and overwrites changes saved when a was saved. >> > >> > >> > >> > If I load explicitly selecting the lock I want, it does work as I’d >> > expect >> > and I get my exception. >> > >> > >> > >> > This is surprising to me. Ayende noted in a concurrency blog post >> > >> > (http://ayende.com/Blog/archive/2009/04/15/nhibernate-mapping-concurrency.aspx) >> > that using a version column should result in the generated UPDATE SQL >> > statement to compare against the version number – and if the version >> > doesn’t >> > match the original version, we should get a StaleObjectException. >> > >> > >> > >> > Can anyone clarify what’s going on here? >> > >> > >> > >> > Thanks. >> > >> > Remi. >> > >> > >> > >> > -- >> > >> > You received this message because you are subscribed to the Google >> > Groups >> > "nhusers" group. >> > To post to this group, send email to [email protected]. >> > To unsubscribe from this group, send email to >> > [email protected]. >> > For more options, visit this group at >> > http://groups.google.com/group/nhusers?hl=. >> > >> >> -- >> >> You received this message because you are subscribed to the Google Groups >> "nhusers" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/nhusers?hl=. >> >> > > > > -- > Fabio Maulo > > -- > > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=.
