Re: optimistic locking?

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Tue Jun 08 2004 - 16:13:43 EDT

  • Next message: PaulC.177094..loglines.com: "Caching/Concurrency Questions"

    To summarize what Michael said...

    There are two related features. One is generic optimistic locking,
    another is row auto-versioning. Optimistic locking is fully supported
    by Cayenne. Auto-versioning is an extension of optimistic locking and
    is not yet directly supported. It has to be done manually. My
    suggestion is to override DataObject.setPersistenceState(..) to
    initialize/increment "version" value.

    Including auto-versioning in Cayenne is one of the things planned for
    the distant future. If someone is motivated enough to implement it now,
    we'll gladly accept the contribution ;-)

    Andrus

    On Jun 8, 2004, at 10:30 AM, Gentry, Michael wrote:

    > If I understood correctly, you expect Cayenne to automatically
    > initialize 'version' to zero and, on each subsequent UPDATE, to
    > automatically increment the value?
    >
    > If so, that is not what optimistic locking does (at least, I'm assuming
    > Cayenne works the way EOF does in this regard, since I haven't had time
    > to use the new optimistic locking features).
    >
    > Let's say you have a User table, with firstName, lastName, and
    > favoriteColor fields (plus a primary key, but we don't really care
    > about
    > that), all of which are locking attributes:
    >
    > firstName: Mary
    > lastName: Johnson
    > favoriteColor: Red
    >
    > Then Mary gets married and changes her last name to "Jones" and you do
    > a
    > setLastName("Jones") on that record (after fetching it into memory, of
    > course). When you save the changes, Cayenne should issue something
    > like
    > this:
    >
    > UPDATE User SET lastName = 'Jones'
    > WHERE firstName = 'Mary' AND lastName = 'Johnson' AND favoriteColor =
    > 'Red' AND primaryKey = ...
    >
    > Basically, any attributes marked as used for locking are included in a
    > WHERE clause with their previous values present. Also, only the
    > attributes that changed values should be present in the SET clause.
    >
    > Be sure you do not use BLOBs as locking attributes! I'd even suggest
    > having BLOBs in their own table.
    >
    > If you want to use a 'version' column, you can do that, but it'll
    > probably be more manual on your part (initializing and incrementing
    > yourself) and is less effective. When the original values are checked
    > in the UPDATE clause, it helps ensure data integrity even when someone
    > (production support) goes in and updates a DB value by hand (they'd
    > most
    > likely not update the 'version' column) or if there is another
    > application which shares the DB and does updates and doesn't use all
    > the
    > nice Cayenne framework code you've written.
    >
    > Hope that helps.
    >
    > /dev/mrg
    >
    >
    > -----Original Message-----
    > From: Bill Dudney [mailto:bdudne..ac.com]
    > Sent: Tuesday, June 08, 2004 5:58 AM
    > To: cayenne-use..bjectstyle.org
    > Subject: optimistic locking?
    >
    >
    > Hi All,
    >
    > I would like to introduce a 'version' property on my objects and use it
    > for optimistic locking.
    >
    > I modified my model to add optimistic locking (with the checkbox
    > 'Optimistic Locking' in the Entity tab) to each of my classes and
    > specified which attributes in each was 'Used for Locking' (the version
    > attribute).
    >
    > I expected Cayenne to automatically set the 'version' attribute to zero
    > on initialization and then maintain its value with each commit. i.e.
    > Create Foo, version = 0, update Foo version = 1 and I don't have to
    > know or care about this version field. It did not so I initialize it to
    > zero in the default constructor. Is this the expected usage?
    >
    > Thanks!
    >
    > -bd-
    >
    >



    This archive was generated by hypermail 2.0.0 : Tue Jun 08 2004 - 16:13:48 EDT