First an additional answer: you can return whatever you want. That will then 
become the return value of the performInTransaction() call.

But I have a related question. How is an explicit rollback supposed to work 
there? If I halfway through decide to roll back the entire transaction, after a 
few commitChanges() already have happened, how do I do that?

I tried

        context.rollbackChangesLocally();
        BaseTransaction.getThreadTransaction().rollback();

but then I get

java.lang.IllegalStateException: Transaction must have ‘STATUS_ACTIVE’ to be 
committed. Current status: STATUS_ROLLEDBACK

What seems to work is throwing a CayenneRuntimeException, but that will get 
rethrown after the rollback, so I would have to catch that again outside the 
performInTransaction() call, which doesn't feel how it's supposed to work.

Maik



> Am 20.03.2018 um 16:40 schrieb John Huss <johnth...@gmail.com>:
> 
> performInTransaction just encapsulates a database transaction, so it has no
> affect on the object (ORM) level, it only affects what is visible in the
> database.  So the behavior with commitChanges() is the same as it would be
> outside a performInTransaction block.
> 
> 
> On Tue, Mar 20, 2018 at 10:25 AM Juan Manuel Diaz Lara
> <jmdia...@yahoo.com.invalid> wrote:
> 
>>  runtime.performInTransaction(() -> {
>>        // ... do some changes
>>        context.commitChanges();
>> 
>>        // ... do more changes
>>        context.commitChanges();
>> 
>>        return true;
>> });   Previous code is an example on "Guide to 4.0 Features".
>> My questions are:
>>   - What is then persistence state of objects after first commitChanges()
>> ?
>> 
>>   - If second commitChanges()  fails, what happen to the persistence
>> state coming from firs commitChages() ?
>>   - What happen if we return false?
>> Atte. Juan Manuel Díaz Lara

Reply via email to