Re: Optimistic lock failure

From: Mike Kienenberger (mkienen..mail.com)
Date: Thu Dec 07 2006 - 10:28:05 EST

  • Next message: David Norwood: "RE: Optimistic lock failure"

    One other thing to note. If you can't fix the database/driver, what
    you can do is to write your own converter for this data type. I
    don't remember the details, but it's probably a matter of extending
    the current db adapter class, and implementing an extended type for it
    that rounds/truncates appropriately. I think you can take a look at
    Oracle Date handling for one such example.

    On 12/7/06, David Norwood <david..irtuant.com> wrote:
    > Thank you, sir Mike. I believe that answers my question.
    >
    > -----Original Message-----
    > From: Mike Kienenberger [mailto:mkienen..mail.com]
    > Sent: Thursday, December 07, 2006 4:19 PM
    > To: cayenne-use..ncubator.apache.org; davidn@virtuant.com
    > Subject: Re: Optimistic lock failure
    >
    > Certain combinations of databases and field types don't work for
    > optimistic locking if the application and the database don't store the
    > data using the equivalent representations.
    >
    > I'm guessing the problem is this:
    >
    > DATA1=2.229999999999999982236431605997495353221893310546875
    >
    > For optimistic locking to work, the value specified with SET (in
    > UPDATE) and the value specified later in a qualifier must be equal in
    > the eyes of the database.
    >
    > Ie, if you specify
    >
    > UPDATE
    > SET DATA1=2.229999999999999982236431605997495353221893310546875
    >
    > And then in the next statement use
    >
    > ....WHERE DATA1=2.229999999999999982236431605997495353221893310546875
    >
    > and your database has truncated or rounded the value of DATA1 in the
    > first update, then the equality statement will fail. For example, the
    > database might have DATA1 = 2.223 at this point.
    >
    > I've had similar problems with certain versions of Oracle, Oracle
    > drivers and Timestamp fields.
    >
    >
    >
    > On 12/7/06, David Norwood <david..irtuant.com> wrote:
    > > Hi,
    > >
    > >
    > >
    > > I the following transaction I insert a new record into a table, then
    > > directly run rules on the data inserted and call an update to set specific
    > > columns after running the rules. See the following error; isn't it OK for
    > > the same user to update the table after inserting a row? Why am I getting
    > > this error??
    > >
    > >
    > >
    > > TIA,
    > >
    > >
    > >
    > > -david
    > >
    > > ---------------- error output -----------------------
    > >
    > > 2006-12-06 09:50:52,406 DEBUG [org.jboss.mx.loading.RepositoryClassLoader]
    > > setRepository,
    > > repository=org.jboss.mx.loading.HeirarchicalLoaderRepository..c1f2,
    > > cl=org.jboss.mx.loading.UnifiedClassLoader..ec21a{ url=null
    > ,addedOrder=0}
    > >
    > > 2006-12-06 09:50:52,421 INFO [org.objectstyle.cayenne.access.QueryLogger]
    > > --- will run 1 query.
    > >
    > > 2006-12-06 09:50:52,421 INFO [org.objectstyle.cayenne.access.QueryLogger]
    > > UPDATE dbo.dochistory SET AVGREADING = ? WHERE ID = ? AND AUDITOR IS NULL
    > > AND AVGREADING IS NULL AND DATA1 = ? AND DATA10 IS NULL AND DATA2 IS NULL
    > > AND DATA3 IS NULL AND DATA4 IS NULL AND DATA5 IS NULL AND DATA6 IS NULL
    > AND
    > > DATA7 IS NULL AND DATA8 IS NULL AND DATA9 IS NULL AND DATETIME = ? AND
    > INFO1
    > > IS NULL AND INFO10 IS NULL AND INFO2 IS NULL AND INFO3 IS NULL AND INFO4
    > IS
    > > NULL AND INFO5 IS NULL AND INFO6 IS NULL AND INFO7 IS NULL AND INFO8 IS
    > NULL
    > > AND INFO9 IS NULL AND ISDELETED = ? AND ISFAILURE = ? AND ISRECHECK = ?
    > AND
    > > PERSONNAME = ? AND PRESHIPPER IS NULL AND PRODUCTCODE IS NULL AND VERIFIER
    > > IS NULL AND LOCATIONID = ? AND ORG_ID = ? AND PACKAGEID = ? AND USR_ID = ?
    > >
    > > 2006-12-06 09:50:52,421 INFO [org.objectstyle.cayenne.access.QueryLogger]
    > > [bind: 2.229999999999999982236431605997495353221893310546875, 4557, NULL,
    > > NULL, 2.229999999999999982236431605997495353221893310546875, NULL, NULL,
    > > NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2006-12-06 09:50:52.078', NULL,
    > > NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'false', 'false',
    > > 'false', 'Tom Johnson', NULL, NULL, NULL, 196, 34, 1179, 9]
    > >
    > > 2006-12-06 09:50:52,468 INFO [org.objectstyle.cayenne.access.QueryLogger]
    > > *** error.
    > >
    > > org.objectstyle.cayenne.access.OptimisticLockException: [v.1.2.1 August 30
    > > 2006] Optimistic Lock Failure, SQL: [UPDATE dbo.dochistory SET AVGREADING
    > =
    > > ? WHERE ID = ? AND AUDITOR IS NULL AND AVGREADING IS NULL AND DATA1 = ?
    > AND
    > > DATA10 IS NULL AND DATA2 IS NULL AND DATA3 IS NULL AND DATA4 IS NULL AND
    > > DATA5 IS NULL AND DATA6 IS NULL AND DATA7 IS NULL AND DATA8 IS NULL AND
    > > DATA9 IS NULL AND DATETIME = ? AND INFO1 IS NULL AND INFO10 IS NULL AND
    > > INFO2 IS NULL AND INFO3 IS NULL AND INFO4 IS NULL AND INFO5 IS NULL AND
    > > INFO6 IS NULL AND INFO7 IS NULL AND INFO8 IS NULL AND INFO9 IS NULL AND
    > > ISDELETED = ? AND ISFAILURE = ? AND ISRECHECK = ? AND PERSONNAME = ? AND
    > > PRESHIPPER IS NULL AND PRODUCTCODE IS NULL AND VERIFIER IS NULL AND
    > > LOCATIONID = ? AND ORG_ID = ? AND PACKAGEID = ? AND USR_ID = ?], WHERE
    > > clause bindings: [USR_ID=9, DATA6=NULL, ISRECHECK='false',
    > > ISDELETED='false', INFO1=NULL, LOCATIONID=196, DATA5=NULL,
    > AVGREADING=NULL,
    > > AUDITOR=NULL, INFO8=NULL, DATA2=NULL, INFO2=NULL, DATETIME='2006-12-06
    > > 09:50:52.078', VERIFIER=NULL, DATA9=NULL, INFO4=NULL, PACKAGEID=1179,
    > > ID=4557, INFO9=NULL, INFO3=NULL, DATA8=NULL, INFO6=NULL, DATA7=NULL,
    > > INFO7=NULL, PERSONNAME='Tom Johnson', PRESHIPPER=NULL, DATA4=NULL,
    > > DATA10=NULL, ORG_ID=34, DATA3=NULL, INFO10=NULL, INFO5=NULL,
    > > PRODUCTCODE=NULL,
    > > DATA1=2.229999999999999982236431605997495353221893310546875,
    > > ISFAILURE='false']
    > >
    > > at
    > >
    > org.objectstyle.cayenne.access.jdbc.BatchAction.runAsIndividualQueries(Batch
    > > Action.java:235)
    > >
    > > at
    > >
    > org.objectstyle.cayenne.access.jdbc.BatchAction.performAction(BatchAction.ja
    > > va:117)
    > >
    > >
    > >
    > >
    > >
    >
    >



    This archive was generated by hypermail 2.0.0 : Thu Dec 07 2006 - 10:28:52 EST