no.

2009/11/23 Rémi Després-Smyth <[email protected]>

>  Fabio,
>
> There wouldn’t be two transactions on the same thread, but I’m working on a
> web app, so different worker threads would be running using different
> sessions.  I did not think setting up a test that uses two different threads
> to be necessary to test the scenario – instead, I just used two different
> sessions, which is close enough to how it would work in production anyhow.
>
>
>
> I don’t think this is an invalid question to be asking.  The app’s on a web
> server, and concurrent requests are processed by different worker threads,
> aren’t they?  Setting up a test that uses two distinct threads would be
> unnecessary and unreliable, since it would be difficult to ensure correct
> timing between the two threads for the behaviour I want to see.  As a
> result, I believe the test I setup is actually quite appropriate for what I
> want to check.
>
>
>
> No?
>
>
>
> Remi.
>
>
>
> *From:* Fabio Maulo [mailto:[email protected]]
> *Sent:* November 21, 2009 10:48 AM
> *To:* [email protected]
> *Subject:* Re: [nhusers] how should optimistic concurrency using a version
> field work?
>
>
>
> is that ;)
>
> btw what I mean, is that the tests is not well formed in many sense.
>
> If our friend Remi want test NH behaviour he should try to recreate a
> behaviour-test using a more real scenario trying to reproduce how "things"
> happens in his application.
>
> For example... How Remí can recreate that sequence of actions in a real app
> ?
>
> Even if he can, how much is correct to have two opened transactions in the
> same thread ?
>
> ... and so on...
>
>
>
> 2009/11/21 Oskar Berggren <[email protected]>
>
> 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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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]<nhusers%[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=.


Reply via email to