I examined the Transactional interface more carefully, and the comment on end()
reads "/** Finish the transaction - if a write transaction and commit() has not
been called, then abort */“.
So it seems that there are definitely multiple ideas about the meaning of
end()! {grin}
---
A. Soroka
The University of Virginia Library
> On Sep 25, 2015, at 11:43 AM, Andy Seaborne <[email protected]> wrote:
>
> On 25/09/15 15:07, A. Soroka wrote:
>> Okay, I committed a pair of simple tests in commit() and abort() to
>> see to it that you can’t call them outside a transaction and that
>> made all of AbstractTestTransaction pass.
>>
>> This worries me, because you suggested that it would probably require
>> a finer-grained lifecycle modeled, and I didn’t do that, so I’m
>> wondering what I’m missing. {grin}
>
> It'll depend on the status of "end" -- I have considered the transaction to
> run from begin() to end() and end() in a W transaction without commit() or
> abort() is an error. c.f. R transaction of begin(R)-end() scoping.
>
> The idiom is then (and can be made nicer in Java8):
>
> begin(W)
> try {
> ... reads and writes ...
> } finally { end() ; }
>
> or variations with an auto-abort on exceptions. The try{} is a consistency
> scope. That does not work with the auto-autocommit.
>
> In your case begin(W)-end() is a silent abort?
>
>
> BTW what happens if you get end-end? index().end(); is called repeatedly.
> Does that matter? (haven't had time to look at that)
>
>> One remark of yours gives me
>> pause, though: “I managed to add after commit.” That’s definitely
>> intentional, because on your advice [*], I set up
>> DatasetGraphInMemory so that a mutating operation outside of a
>> transaction auto-wraps itself in a transaction. So calling add after
>> commit is actually two legitimate transactions “under-the-hood".
>>
> > Did I misinterpret what you advised? Did you mean me to add
> > “auto-transact” in a more configurable way?
>
> So in a multithreaded environment, the autocommit despite being inside the
> begin-end is not consistent with the begin-commit part. Needs thinking about.
>
> A general point : we need to decide the fine grain details of the transaction
> models (or variations) we want to provide. Until now it's been TDB and
> DatasetGraphWithLock so not a wide range of choices pushing the design
> boundaries and stuff is implicit. Great thing about 624 is sorting that out.
>
>
> Current TDB works non-transactionally until the first begin then explicit
> transaction only. That's to maximise compatibility. autocommit and disk is
> dire (disk I/O per quad add is going to easily become painful - just look at
> many database lists with "why does my simple app go so slow" questions)l in
> -memory is different.
>
> TDB non-transactional isn't even an implicit transaction. Current TDB2 is
> explicit transaction only because (1) it has no concept of update in-place
> due to immutable data structures and (2) I haven't spent any time on it.
>
> I like the Java8 style Txn.executeWrite style (maybe shorted names - details).
>
> In TDB2, transaction are promotable (read to write) though it is allowed only
> if no W transaction has run (strictly, started) and started it's own version
> of the DB. The API is more general that TDB2 supports. begin() and
> auto-promote is possible but not IIRC done.
>
> promote is the only time system aborts can happen so it creates interesting
> app issues.
>
> My inclination is to suggest that we encourage explicit transactions as the
> recommended style. (Rhetorically) Is it to much of app burden? Don't know.
> Thoughts?
>
> Andy
>
>> --- A. Soroka The University of Virginia Library
>>
>> [*] http://permalink.gmane.org/gmane.comp.apache.jena.devel/10529
>>
>>> On Sep 24, 2015, at 1:05 PM, Andy Seaborne <[email protected]>
>>> wrote:
>>>
>>> The rest are testing that e.g. begin-abort-commit is an error. It
>>> looks like the transaction lifecycle is not being tracked. It
>>> needs finer granularity than DatasetGraphInMemory.isInTransaction.
>>> May be as simple as NOT_TXN -> ACTIVE_TXN -> FINISHING_TXN (->
>>> NOT_TXN). Just in/out isn't enough for, e.g.
>>> begin-commit-add_quad->end , begin-commit-commit. I managed to add
>>> after commit.
>>
>