I do manual transaction handling like this: TransactionFactory txFactory = CayenneRuntime.getThreadInjector().getInstance(TransactionFactory.class); Transaction tx = txFactory.createTransaction(); tx.begin(); try { // do work
context.commitChanges(); tx.commit(); } catch (Exception e) { tx.rollback(); throw e; } On Fri, Nov 8, 2024 at 5:21 PM Christian Gonzalez < christian.gonza...@smartscrubs.com> wrote: > Also forgot to mention but the runtime is configured with external > transactions enabled. > > On Fri, Nov 8, 2024 at 4:14 PM Christian Gonzalez < > christian.gonza...@smartscrubs.com> wrote: > > > Hello, I am currently using cayenne 4.2 and am running into some issues > > when committing my changes. We have an application that uses a single > > object context to do all the necessary changes we want to save to the > > database and then when the user clicks the save button we call the > > objectContext.commit(). The issue is that if a commit exception happens > > during this process we end up with half committed data as the transaction > > doesn't get rolled back. From what I understand, if I were to capture > > the exception and do objectyContext.rollbackChanges it would only remove > > the changes to the object context, not actually rollback the changes in > > the database. I also tried a mixture of this example provided for > > transactions in the cayenne documentation > > <https://cayenne.apache.org/docs/4.2/cayenne-guide/>and this example at > > the bottom from apache > > < > https://nightlies.apache.org/cayenne/docbook/index/persistent-objects-objectcontext.html > >. > > Essentially I'm calling the runtime.performInTransaction and inside of > the > > TransactionOperation using the BaseTransaction.getThreadTransaction() > > method to get the transaction, then calling the objectContext.commit and > > after calling that method doing transaction.commit(). Iif an exception > > happens I call transaction.rollback() but once it's all done I still see > > the changes that were sent before the exception present in the database > and > > when I look at the logs of the SQL that gets sent I don't see a > transaction > > started. My question is am I using the transaction correctly or how do I > > get all the changes in the object context to be reversed if an exception > > happens? > > >