Hi John, thanks, works, with slight modifications. CayenneRuntime.getThreadInjector() may return null because it's a ThreadLocal.
Transaction tx = MyCore.serverRuntime().getInjector().getInstance( TransactionFactory.class ).createTransaction(); BaseTransaction.bindThreadTransaction( tx ); tx.begin(); … Maik > Am 20.03.2018 um 17:20 schrieb John Huss <johnth...@gmail.com>: > > To rollback you have to use the more explicit API: > > TransactionFactory txFactory = > CayenneRuntime.getThreadInjector().getInstance(TransactionFactory.class); > Transaction tx = txFactory.createTransaction(); > tx.begin(); > try { > // do stuff > > context.commitChanges(); > tx.commit(); > } catch (Exception e) { > tx.rollback(); > throw e; > } > > > > > On Tue, Mar 20, 2018 at 11:07 AM Maik Musall <m...@selbstdenker.ag> wrote: > >> 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 >> >>