David Nuescheler wrote:
hi felix,


I wonder what happens with locks aquired in the course of
executing a transaction when the transaction is commited
or rolled back. Is it the responsibility of the application
to release the locks or will the repository take care of this?

how about chapter "8.5.10 Locks and Transactions" in the spec ;)

If I understand "8.5.10 Locks and Transactions" right, locking can never be part of a global transaction where prior successful locking is required for a successful commit.

if you say "prior" do you mean before the transaction? of course locking can easily be part of a global transaction.


I try to lock two nodes in different transactional resources spanned by a global transaction before doing some work. See scenario below ...


A scenario where the lock can't be obtained (e.g. timeout) and
the whole global transaction should be rolled back would not be
possible if the locking is part of a separate transaction.

that's exactly how it works... as defined in the mentioned chapter
"In order to use locks properly, locking and unlocking must be done in separate transactions"
something like this sequence is permissable:

As mentioned above locking and unlocking must be done in separate transactions according to the spec.

Now my question is what happens in the following scenario:

A global transaction over two transactional resources (say
sessions) sA and sB should be executed:

[1] begin
[2]   lock nA in sA
[3]   lock nB in sB
[4]   sA.save
[5]   sB.save
[6] commit

[1] start of transaction, enlist the two resources
[2] Is a LockException thrown if node is locked already?
    As stated in the spec, the lock is not visible in
    other sessions, right?
[4,5] save node changes for committing
[6] commit changes: changes are made visible to
    other sessions. What happens, if another
    session sC successfully locked node nA between the
    execution of [4] and [6]? As Dominique mentioned,
    the prepare() method is currently a no-op and
    there is no possibility to prevent that node
    nB is locked (returns prepared ok) and node
    nA is not (LockException). It seems that
    the ACID property of this transaction is broken.

Regards

Felix



begin
lock
do A save
commit


begin
do B save
unlock
commit



Using nested transactions is afaik no alternative because
transactional resources are not required to support nested
transactions.

of course.


What is best practices with global transactions
and jackrabbit?

Global (XA) Transaction behaviour is part of the JSR-170 spec.

"8.1. Transactions" and for example "8.1.1 Container Managed Transactions: Sample Request Flow"

i think all this stuff is really prominently documented in the spec.
can we do something to make it easier for you to find these sections?


regards,
david

.ps: a common mistake is to use locks to achieve ACID which is
pointless overhead in a transactional environment.



--
Felix R�thenbacher                  [EMAIL PROTECTED]
Wyona Inc.  -   Open Source Content Management   -   Apache Lenya
http://www.wyona.com                      http://lenya.apache.org

Reply via email to