Right those are some of the issues.

So one way would be to specify a tx timeout upfront which automatically rolls 
back the tx (you can just add a kind of timer/TTL to the tx-session object) and 
clears it as well.

Keeping state on the server is always a problem but I don't see a different 
solution for that. But it might worth a try especially if it helps you with 
your concrete scenario.

Michael



Am 07.07.2011 um 15:30 schrieb Patrik Sundberg:

> good idea. i'll ponder it for a bit.
> 
> but yes, we clearly need to keep state around, so for REST it'd be carried
> around in session. but on server side I guess you have issues with never
> ending transactions, how to cull them, etc. since it's a stateless
> req/response comm channel. on a permanent channel it's easy to detect
> disconnect and clean up, over http not as easy.
> 
> thanks
> 
> 
> On Thu, Jul 7, 2011 at 12:42 PM, Michael Hunger <
> michael.hun...@neotechnology.com> wrote:
> 
>> But then it would be possible to write a RequestFilter for the Neo4j-Server
>> that does start and commit/rollbacks transactions.
>> 
>> I.e. you create a tx object and put it in the session-context if there is
>> none and return a tx-token that the filter uses (e.g. as header-field).
>> then later you can pull it out again and attach it to the current thread
>> (that's the tricky part).
>> On commit or rollback you just do that with the tx (after attaching it to
>> the thread).
>> 
>> As the RestfulGraphDb and the Filter share the same execution thread this
>> could/should work.
>> 
>> I wouldn't want to support that in the neo4j server by default as this
>> creates a lot of server-side state that has to be managed.
>> 
>> But if it works out one could publish that as server-extension.
>> 
>> HTH
>> 
>> Michael
>> 
>> Am 07.07.2011 um 13:30 schrieb Patrik Sundberg:
>> 
>>> Following up on the topic of transactions for client API.
>>> 
>>> What is the current plan for some sort of client side API supporting
>>> transactions?
>>> 
>>> I'm playing around with some ideas here and the lack of transaction
>> support
>>> in the client API is problematic. I know there's BATCH support in the
>> REST
>>> API which effectively is a transaction, but it doesn't always suit. For
>>> example I have the following steps that I'd like to accomplish:
>>> - create a reference node
>>> - check if a node with a given domain id exist in an index, if it does,
>> fail
>>> - create an entity node for the given domain id
>>> - add entity node to the index
>>> - attach entity node to ref node
>>> - create a node representing a specific version of the entity node
>>> - attach the version node to the entity node, with some properties on the
>>> relationships signifying valid time
>>> 
>>> That should all be considered an atomic operation, all or nothing. Doing
>> it
>>> step by step is very easy and natural with REST API, but trying to roll
>> back
>>> on error is flaky.
>>> 
>>> I think could batch it, but from a programming style it becomes pretty
>>> unnatural. Same thing with a plugin for doing the steps. The natural flow
>> of
>>> code client side gets distorted by having to collect a lot of data
>> upfront
>>> and then provide all that data to a method call. It's doable, just
>> doesn't
>>> seem ideal.
>>> 
>>> Using an embedded db, exposing as some sort of service etc is also
>> doable,
>>> it's just that my domain is graph related and I'm pretty happy with just
>> the
>>> "primitives" and using a remote server (if I could have transactions).
>>> Number of clients are quite a few and need to share their data + don't
>> all
>>> run all the time so can't make the client API the embedded api.
>>> 
>>> I'd think it's not an uncommon situation and many people wishing for a
>>> support for natural client side transaction API (similar to embedded
>> api).
>>> 
>>> Patrik
>>> 
>>> 
>>> On Tue, Jul 5, 2011 at 12:27 PM, Patrik Sundberg
>>> <patrik.sundb...@gmail.com>wrote:
>>> 
>>>> yeah, harder problem than my first hunch.
>>>> 
>>>> sounds like plugins is the way to go for now, hopefully introduction of
>>>> non-rest protocol with same interface as embedded API in 1.5 will
>> simplify
>>>> things in the future.
>>>> 
>>>> thanks
>>>> 
>>>> 
>>>> On Mon, Jul 4, 2011 at 11:07 PM, Michael Hunger <
>>>> michael.hun...@neotechnology.com> wrote:
>>>> 
>>>>> Patrick,
>>>>> 
>>>>> I've already thought long and hard about that.
>>>>> 
>>>>> The problem is you can't implement that transparently as you can never
>>>>> allow code in a second call rely on data derived from a previous one.
>>>>> 
>>>>> The simplest form that I came up with is a "BatchCommand" that gets an
>> API
>>>>> interface injected that allows requests but doesn't return data.
>>>>> 
>>>>> The execution of this Batch command would then return a "BatchResult"
>> with
>>>>> all the data acquired during the batch operation.
>>>>> 
>>>>> Another way would be to inject the normal GraphDatabaseService
>> interface,
>>>>> record the invocations in a first phase and then execute the batch
>> command
>>>>> again (this time ignoring the inputs but then returning the results)
>> but
>>>>> this is bad from a usability perspective.
>>>>> 
>>>>> One critical issue is the creation of relationships as they depend on
>> the
>>>>> correct node-ids of previously created nodes. Jacob already thought
>> about
>>>>> some means of referring to previous output data but I think kept away
>> from
>>>>> that as we didn't want to make this batch-interface a turing complete
>>>>> language.
>>>>> 
>>>>> So you see, it's not that simple.
>>>>> 
>>>>> Michael
>>>>> 
>>>>> Am 27.06.2011 um 20:45 schrieb Patrik Sundberg:
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> Since there is now possible to send off batches of operations via the
>>>>> REST
>>>>>> interface, I was wondering if anyone has started to look at
>> implementing
>>>>>> transactions in the java REST client (
>>>>>> https://github.com/jexp/neo4j-java-rest-binding) ?
>>>>>> 
>>>>>> It would seem possible, but I can also see it could involve some major
>>>>>> reorganizing of the internals of the client to make everything aware
>> of
>>>>>> transactions and submit via batch command.
>>>>>> 
>>>>>> Patrik
>>>>>> _______________________________________________
>>>>>> Neo4j mailing list
>>>>>> User@lists.neo4j.org
>>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>> 
>>>>> _______________________________________________
>>>>> Neo4j mailing list
>>>>> User@lists.neo4j.org
>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>> 
>>>> 
>>>> 
>>> _______________________________________________
>>> Neo4j mailing list
>>> User@lists.neo4j.org
>>> https://lists.neo4j.org/mailman/listinfo/user
>> 
>> _______________________________________________
>> Neo4j mailing list
>> User@lists.neo4j.org
>> https://lists.neo4j.org/mailman/listinfo/user
>> 
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user

_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to