[jbosscache-dev] READ_COMMITTED should be enforced for Hibernate 2nd level caching?

Manik Surtani manik at jboss.org
Wed Mar 18 07:34:28 EDT 2009


On 17 Mar 2009, at 20:33, Jason T. Greene wrote:

> Brian Stansberry wrote:
>
>>> However, this sounds like a problem with PFER. If someone calls  
>>> PFER, I think the original transaction should resync the node  
>>> snapshot.
>> How would this be done? AFAIK the application has no control over  
>> the data in JBCs transaction context.
>
> The PFER implementation, not the application, would just drop the  
> node from the tx context which invoked pfer. That would mean that  
> any subsequent read would fetch the most current data.

No, that is not correct.  PFER suspends ongoing TXs and runs outside  
of any TX, to prevent a failure rolling back the TX.  And this is the  
root of the problem.

I have fixed this in trunk, the correct solution is to fix the  
mismatch in expected behaviour between a removeNode() and any other  
write when using R_R, write skew checking is disabled, and a null node  
has already been read into the tx context.

Basically, what happens is this (assuming write skew checking is off):

1.  Read node, is null // if using R_R, a NullNodeMarker is placed in  
context so a re-read is not attempted, preserving R_R semantics.
2.  A Write is performed // this ends up in creating a new node, and  
writing changes, overwriting any concurrent changes that may have  
occurred between 1 and 2.

This is correct and expected if using R_R and write skew checking is  
off.  Now looking at the remove node case:

1.  Read node, is null // if using R_R, a NullNodeMarker is placed in  
context so a re-read is not attempted, preserving R_R semantics.
2.  A removeNode is performed // the node in context is marked as  
removed and processed accordingly, and in the case of a  
NullMarkerNode, this is a no-op.

This is where the problem lies.

I have fixed this using a new type of marker node,  
NullNodeMarkerForRemove, which holds a reference to the parent, and  
actually causes the parent to remove the necessary child, providing  
the same overwrite semantics as in the case of a write.

This is in trunk if anyone wants to take a look

	http://tinyurl.com/cltfsh

Cheers
Manik

--
Manik Surtani
Lead, JBoss Cache
http://www.jbosscache.org
manik at jboss.org




-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jbosscache-dev/attachments/20090318/b73d4371/attachment.html 


More information about the jbosscache-dev mailing list