Hi,
We are introducing transactions to our system, and run some concurrency
tests. We read in jsr170 spec that transactions should be completely
isolated from each other.
Considering following simple block of code :
> folder = getFolder(session);
> CrxUserTransaction ut = new CrxUserTransaction(session);
>
> 0 ut.begin();
> 1 folder.checkout();
> 2 Node child = folder.addNode("child");
> 3 child.addMixin("mix:versionable"); 4 child.setProperty("id", id);
> 5 child.setProperty("iteration", i);
> 6 folder.save();
> 7 child.checkin();
> 8 folder.checkin();
> 9 ut.commit();
We noticed different exceptions in different lines, executing this block
concurrently :
- line 1 - InvalidItemStateException : the item does not exist anymore,
- line 6 - InvalidItemStateException : item cannot be saved because it
has been modified externally,
- line 9 - XAException caused by StaleItemStateExcpetion :
{http://www.jcp.org/jcr/1.0}isCheckedOut has been modified externally
Certainly we don't share session between threads, we use dedicated
session for each thread.
So, it looks like transactions can see changes made by other
transactions, what means jackrabbit doesn't support SERIALIZABLE and
even REPETABLE_READ isolation level, but only READ_COMMITTED level.
Can anybody explain what really isolation level is supported by
jackrabbit implementation currently ?
Regards
Przemo Pakulski
www.cognifide.com