On 11/06/2010, at 1:48 PM, Antony Blakey wrote:

> 
> On 11/06/2010, at 7:28 AM, James Reeves wrote:
> 
>> On 10 June 2010 22:40, Michael Jaaka <michael.ja...@googlemail.com> wrote:
>>> Not good, since if database commit fail it is too late for dosync to
>>> rollback.
>>> In fact database commit should somehow cooparate with dosync commit
>>> which is just a case of distributed transaction.
>> 
>> You're right. In which case, I don't believe there's a way to do this
>> without accessing the clojure.lang.LockingTransaction class directly.
> 
> It's not possible to do this without a two phase commit, which would require 
> quite a change to clojure's transactional mechanism in order to break the 
> existing commit login into a prepare and commit.

Now that I think about it, you could do this in clojure if you treat the 
clojure transaction as the last in line requiring prepare/commit. The final 
transaction participant can fold the prepare/commit into a simple commit using 
the following algorithm:

prepare all data sources
if any fail
    rollback all data sources and rollback the clojure transaction
else
    commit the clojure transaction
    if it succeeds
        commit all data sources
    else
        rollback all data sources

This doesn't give you full 2PC because it doesn't handle comms failure, but it 
does handle normal transactional semantics.

Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

If you pick up a starving dog and make him prosperous, he will not bite you. 
This is the principal difference between a man and a dog.
  -- Mark Twain


-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to