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

which jira issue are you refering to?

cheers
stefan

> 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.
>
> 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
> >>
> >
> >

Reply via email to