Hi and thanks for the answer,

By close transaction I mean commit. The code as it is does not share
transactions.

The problematic use case is:

T1 begin
 create rel 0 -> 1
T1 commit
T1 begin
 create rel 1 -> 2
T2 begin
 create rel 0 -> 3  <<<<<< deadlock
 set property 3
T2 commit
T1 set property 2
T1 commit

The case that works (with 0 -> 1 and 0 -> 3 already created):

T1 begin
 obtain 0 -> 1
 obtain 1
T1 commit
T1 begin
 create rel 1 -> 2
T2 begin
 obtain 0 -> 3
 set property 3
T2 commit
T1 set property 2
T1 commit

The goal is having 0 -> 1 -> 2 and 0 -> 3 created. I suspect the problem
lies within node 0. Is it possible that T1 locks 0 when creating 1 -> 2?

Regards,
--
Daniel Martínez


El mié, 11-11-2009 a las 14:13 +0100, Johan Svensson escribió:

> Hi,
> 
> There is no global lock in Neo4j. We lock on a relationship and node level so:
> 
> create node - write lock on created node (so other tx can't see until
> it exist for real)
> set/remove property - write lock on either the node or relationship
> create / delete relationship - write lock on the relationship and both
> nodes it is connected to
> 
> There is however a special case during relationship create/delete. For
> a short period of time (during commit) a write lock may be grabbed on
> some other relationship (connected to the same node) while updating
> the "dual interleaved linked list" storing the relationships.
> 
> I could not quite understand the use case you describe. By close you
> mean commit/rollback or suspend of transaction? If close means commit
> I get:
> 
> T1 begin
>  create rel 0 -> 1
> T1 commit
> T1 begin
>   create rel 1->2
> T2 begin
>   setProperty 2 // this will block since other open tx has created
> relationship to node 2
> 
> When T1 commits T2 can continue.
> 
> Regards,
> -Johan
> 
> On Wed, Nov 11, 2009 at 12:57 PM, Daniel Martínez
> <[email protected]> wrote:
> > Hi everyone,
> >
> > I am currently testing neo4j (1.0-b9)as a persistence layer for an app.
> > I have encountered an strange problem.
> >
> > I have two threads creating relations at the same time (both open
> > transactions)
> >
> > (0 is root node)
> >
> > T1(main): Begin transaction --> create relationship 0 -> 1 --> Close
> > Transaction --> Begin transaction --> create relationship 1 -> 2 -->
> > create T2 --> wait for T2 --> set property 2 --> .... --> Close
> > Transaction --> ....
> > T2: Begin transaction --> create relationship 0 -> 3 --> set property 3
> > --> Close Transaction
> >
> > T1 is waiting for T2 to end, but it never does because of a deadlock.
> > Why is there such a deadlock? The nodes are not the same (concurrent
> > transactions for 1->2 and 0->3 creation).
> >
> > This does not occur during this situation
> > (0->1, 0->3 exist in database, 0 is root node)
> >
> > T1(main): Begin transaction --> obtain node 1 --> Close Transaction -->
> > Begin transaction --> create relationship 1->2 --> create T2 --> wait
> > for T2 --> set property 2 --> .... --> Close transaction --> ....
> > T2: Begin transaction --> Obtain 3 --> set property 3 --> Close
> > Transaction
> >
> > In this case both transactions commit correctly.
> >
> > Is there a global lock in neo4j when creating relationships?
> >
> > Thanks for your help,
> > --
> > Daniel Martínez
> _______________________________________________
> Neo mailing list
> [email protected]
> https://lists.neo4j.org/mailman/listinfo/user




________________________





 Soluciones de Gestión
    para su empresa




  eBusiness, ERP, CRM




            
________________________
Daniel Martínez Martínez

Gerente
C/ Julia García Boután,
29
28022 Madrid
España









E-mail:
[email protected]
Web:
www.paradisosistemas.es
Comercial:
[email protected]
Tel: 678416758








_______________________________________________
Neo mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to