I have a question about version stamping I can't quite wrap my head around Say I create column "Version" in my table in the DB. I configure my nhibernate nhm.xml to use that as versioning check and set my optimistic-lock="version" Does this not mean that only nhibernate keeps incrementing the number in the row. So if I fire up anything that is not nhibernate controlled and alter the row, the version number will not get incremented? Doesn't that defeat the purpose of version locking?
On Jun 3, 1:05 pm, Oskar Berggren <[email protected]> wrote: > A paragraph in section 5.1.3 of the reference also relates to this: > > "We very strongly recommend that you use version/timestamp columns for > optimistic locking with NHibernate. This is the optimal strategy with > respect to performance and is the only strategy that correctly handles > modifications made outside of the session (ie. when ISession.Update() > is used). Keep in mind that a version or timestamp property should > never be null, no matter what unsaved-value strategy, or an instance > will be detected as transient." > > /Oskar > > 2012/6/2 Michael Abraham <[email protected]>: > > > > > > > > > When you use dynamic-update="true" optimistic-lock="all", NH will issue an > > update like > > > update <table> set <col1>=<newval1>, <col2>=<newval2>, ... where > > <idcol>=<idval> and <col1>=<oldval1> and <col2>=<oldval2>. > > > <col1>, <col2>, ... are the columns that NH thinks you have modified from > > their original values. If the instance is attached, that works. But if the > > instance is detached, NH has no way to figure out the original values of the > > columns. So you also need select-before-update. That causes a select (to > > get the "original" values) before the update, but that select happens after > > you have made your change via SSMS. One option would be to reattach the > > instance before updating it with the new values in the grid, e.g., doing > > someting like session.Lock(instance, LockMode.None) (I may have the syntax > > wrong). If you don't need to use dynamic-update, you might be better off > > using a timestamp column for concurrency control. > > > Mike > > > On Friday, June 1, 2012 8:05:49 AM UTC-4, imonsei wrote: > > >> I have defined a class, and set > > >> dynamic-update="true" optimistic-lock="all" select-before- > >> update="true" > > >> in my tabledefiniton hbm.xml file. > >> I start my program and load my data in displaying it in a > >> datagridview. > >> Next I load up sql management studio (mssql2008 express), connect to > >> the database, and alter an entry in the table i have just loaded into > >> the program. > >> Meanwhile in the program I make sure the change has not propergated > >> into the datagridview. > >> Now I change something in the row I had altered with sql management > >> studio. > >> I save my change from the datagridview to the database. > > >> What I expected was an exception being thrown by the program, but > >> instead I find that the change I made with sql management studio has > >> been overwritten completely with the other data from my program. > > >> Can anyone take a stab at where I go wrong? > >> PS. just say and I'll post the code I use, if you need it. > > > -- > > You received this message because you are subscribed to the Google Groups > > "nhusers" group. > > To view this discussion on the web visit > >https://groups.google.com/d/msg/nhusers/-/HOscx0WG0i8J. > > > 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=en. -- 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=en.
