openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Lee (JIRA)" <>
Subject [jira] Commented: (OPENJPA-359) OptimisticLockException NOT thrown for entity using Timestamp Version when update from concurrent persistence contexts
Date Mon, 10 Sep 2007 14:54:30 GMT


Albert Lee commented on OPENJPA-359:

> I don't understand. IMO, versioning in a clustered environment is a trivial problem
when using the monotonically-incrementing number approach. The only "problems"
arise when using timestamps, and arguably, these aren't problems, but rather just
limitations imposed by the timing needs of the application.
> FTR, with a monotonically-incrementing version number, the database itself acts
as the central server. 

If the version is handed off from the db server, then I agree with you that is is a trivial
problem. However in our implementation the version is handed off from an instance of the persistence
provider of app server (in a cluster). E.g. 

NumberVersionStrategy.nextVersion() { .... return Numbers.valueOf(((Number) version).intValue()
+ 1); }
TimestampVersionStrategy.netxtVersion() { return TimestampHelper.getCurrentTimestamp(); }

TImestamp is always problematic, regardless of how accurate the value is used. It also depends
on how precise (how many fractional digits) the column in the db are being stored. I ran into
a scenario where the Timestamp version is precise to the 100ns but the test still failed.
It is because the version column in the db only holds up to ms.

> By my definitions, sleeping for 2ms does incur a performance cost, but does not
incur any concurrency problem at all. In fact, doing so avoids the concurrency
problem introduced by the new synchronized block.

Sleeping in a thread to avoid duplicate time stamp only solve its own problem. What about
if there are 2 threads coming in at the same time (within the 15ms time window) and asking
for a new version. Without the synchronized block to hand out the next value, the time stamp
version created in both threads will be same if sleep is used, which does not solve the initial
problem. Even with the current suggested solution, it does not guarantee to solve the cluster

> OptimisticLockException NOT thrown for entity using Timestamp Version when update from
concurrent persistence contexts
> ----------------------------------------------------------------------------------------------------------------------
>                 Key: OPENJPA-359
>                 URL:
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc
>    Affects Versions: 1.0.0
>         Environment: WIntel 32 
>            Reporter: Albert Lee
>            Priority: Minor
>         Attachments: OPENJPA-359.patch
> We ran a test using Timestamp as the version field in an entity, the following (pseudo)
test failed when an OptimisticLockException is expected:
>     em1.persist( e0(pk1) );
>     e1 = em1.find(pk1);
>     e2 = em2.find(pk1);
>     e1.setAttr( "new1");
>     e2.setAttr( "new2");
>     em1.merge( e1 );
>     em2.merge( e2 );    <<<< Expect an OptimisticLockException
> The cause of this problem is because the TimestampVersionStrategy.nextVersion returns
a java.sql.Timestamp(System.currentTimeMillis()); In the Wintel environment, the currentTimeMillis()
only has approximately 15ms resolution. When 2 subsequent Timestamp version objects are requested
within this 15ms interval, both has the same version value. Therefore the em2.merge does not
detected the versions difference between o1 and o2, hence no exception is thrown.
> Due to this behavior, the same test case may failed intermittenly depends on the currentTimeMillis()
resolution and the time when a timestamp version is created.  From some preliminary tests,
the resolution for  wintel, linux and z/os are about 15ms, 2ms and 2ms respectively.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message