On Sat, Dec 11, 2010 at 11:52 AM, Norman Maurer <[email protected]> wrote: > Hi there, > > this is fixed in the upcomming jackrabbit 2.2.0 (which should be > released within the next days). In the meantime you can grab a > snapshot here: > > https://repository.apache.org/content/groups/snapshots/org/apache/jackrabbit/ > > Version name is 2.2-SNAPSHOT.
sorry, but i have to contradict norman. the following behavior is as per design: 1. sessionA modifies a property 2. sessionB modifies the same property and saves its changes 3. sessionA tries to save its changes but fails with a InvalidItemStateException because its changes have become stale this is the behavior as implemented in trunk. cheers stefan > > Bye, > Norman > > > > > 2010/12/11 François Cassistat <[email protected]>: >> I've managed to make some basic case that throws the error every time. >> >> import org.apache.jackrabbit.core.TransientRepository; >> >> import javax.jcr.*; >> >> public class JCRConcurrency >> { >> public static void main(String[] args) throws RepositoryException >> { >> Repository repo; >> if (args.length >= 2) >> repo = new TransientRepository(args[0], args[1]); >> else >> repo = new TransientRepository(); >> SimpleCredentials simpleCredentials = new >> SimpleCredentials("username", "password".toCharArray()); >> Session sessionInit = repo.login(simpleCredentials); >> >> // initialization >> Node root = sessionInit.getRootNode(); >> Node test; >> if (root.hasNode("test")) >> test = root.getNode("test"); >> else >> test = root.addNode("test"); >> if (!test.hasProperty("property")) >> test.setProperty("property", 0); >> sessionInit.save(); >> String testIdentifier = test.getIdentifier(); >> >> // session 1 >> Session session1 = repo.login(simpleCredentials); >> Node test1 = session1.getNodeByIdentifier(testIdentifier); >> System.out.println(test1.getProperty("property").getLong()); >> test1.setProperty("property", 1); >> >> // session 2 is doing some other things at the same time >> Session session2 = repo.login(simpleCredentials); >> Node test2 = session2.getNodeByIdentifier(testIdentifier); >> test2.setProperty("property", 2); >> >> // session 2 saves first >> session2.save(); >> session2.logout(); >> >> // session 1 saves >> session1.save(); >> session1.logout(); >> >> sessionInit.logout(); >> >> System.exit(0); >> } >> } >> >> >> >> >> Le 2010-12-10 à 6:12 PM, François Cassistat a écrit : >> >>> Hi list ! >>> >>> I've got some concurrency problem while saving. My application use distinct >>> Sessions object and when two processes are trying to modify the same >>> property of the same node at the same time. I've get the exception below : >>> javax.jcr.InvalidItemStateException: Item cannot be saved because it has >>> been modified externally: node / >>> at >>> org.apache.jackrabbit.core.ItemImpl.getTransientStates(ItemImpl.java:249) >>> at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:981) >>> at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:920) >>> at com.myproject.MyProject.save(MyProject.java:1525) >>> ... >>> >>> >>> I have tried saving this way : >>> synchronized (this) >>> { >>> session.refresh(true); >>> session.save(); >>> } >>> >>> >>> Is there any way around or only locks and transactions can prevent that ? >>> >>> >>> Thanks ! >>> >>> >>> François >>> >> >> >
