Diego, You are right. I wasn't thinking straight.
The only issue I have now, is that we were relying on the nhibernate functionality to work transparently. So none of the current code (which is quite a lot) does not have a check for this row version difference. I still need a common point to inject this functionality and I think Interceptor PreFlush or OnFlushDirty are the only places, which will hook me in centrally at the correct point in the flow. I will not need to update the Version property of the EntityEntry, but basically use very similar code(as in my second post above) and throw an exception instead of updating the version. Thanks for your help!! NK On Apr 20, 4:23 pm, Diego Mijelshon <[email protected]> wrote: > Maybe I wasn't clear. What I intended to say is that, if the version does > NOT match in the application, you already have a stale object. After that, > you execute the update and NH will use the version AGAIN. > Let me do an example: > > Client 1 requests data > Session 1: > a. Load business object (RowVersion 1) > b. Copy business object properties to DTO along with row version > Session 1 closed > > Client 2 updates data of the same business object (RowVersion 2) > > Client 1 submits updated data > Session 2: > a. Load business object (RowVersion 2) > *b. If DTO RowVersion != 2, FAIL AT THIS POINT* > c. Update business object properties from DTO (*no need to update > RowVersion, already validated in b*) > d. Save business object and commit transaction > Session 2 closed > > If there is ANOTHER update between a and d, you'll get a > StaleObjectStateException. > > Diego > > > > > > On Tue, Apr 20, 2010 at 17:02, NK <[email protected]> wrote: > > I don't want to use application version checking, because it is not > > completely fool-proof. The database is the ultimate system of records, > > not the domain. So if the version matches in the application, it does > > not guarantee me that when I execute the update, the database will > > have the same version in the domain. > > > If the database was modified in the brief period of loading the entity > > in the second session and running the update statement, I would have > > broken the optimistic concurrency check. The only way to ensure this > > would be to put an update lock on the record at the time of read to > > ensure consistency, but this would be a huge no no. > > > Thanks for your advise! > > > On Apr 16, 7:44 pm, Diego Mijelshon <[email protected]> wrote: > > > Maybe I don't understand your logic, but what are you expecting exactly? > > > To get a StaleObjectStateException? > > > > You have already gone to the DB, and you have two row versions to > > compare, > > > one in the DTO and one in the fresh-loaded persistent instance. If they > > > don't match, you can fail immediately, without going to the DB again. > > > > Diego > > > > On Fri, Apr 16, 2010 at 12:45, NK <[email protected]> wrote: > > > > Hi, > > > > > We use a DTO pattern in our application to send information to several > > > > clients applications from our central business logic server which uses > > > > NHibernate for ORM. We are trying to implement optimistic concurrency > > > > control using the version property. The version is generated by the > > > > database (SQL Server Timestamp column). > > > > > Here is the sequence of actions > > > > > Client 1 requests data > > > > Session 1: > > > > a. Load business object (RowVersion 1) > > > > b. Copy business object properties to DTO along with row version > > > > Session 1 closed > > > > > Client 2 updates data of the same business object (RowVersion 2) > > > > > Client 1 submits updated data > > > > Session 2: > > > > a. Load business object (RowVersion 2) > > > > b. Update business object properties from DTO along with row version > > > > (RowVersion 1) > > > > c. Save business object and commit transaction > > > > Session 2 closed > > > > > In session 2, when the update statement is generated (call to public > > > > void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) > > > > in our custom timestamp column), the "value" param is taken from the > > > > business object loaded in the session, rather than the value updated > > > > from the DTO. > > > > > I have read forum posts saying that the RowVersion should not be > > > > touched, but we cannot avoid this in a DTO pattern. Is there any way > > > > to work around this? We are 2 years into the development and cannot > > > > remove the DTO pattern. I am sure this is not a new problem and would > > > > really appreciate any help. > > > > > Thanks!! > > > > > -- > > > > 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]> > > <nhusers%[email protected]<nhusers%252bunsubscr...@googlegroups.com> > > > > > > > . > > > > 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]<nhusers%[email protected]> > > . > > > For more options, visit this group athttp:// > > groups.google.com/group/nhusers?hl=en.- Hide quoted text - > > > > - Show quoted text - > > > -- > > 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=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 > athttp://groups.google.com/group/nhusers?hl=en.- Hide quoted text - > > - Show quoted text - -- 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.
