[ https://issues.apache.org/jira/browse/OPENJPA-166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marc Prud'hommeaux updated OPENJPA-166: --------------------------------------- Attachment: OPENJPA-166.patch Attached is a patch that adds a Throwable argument to all the setRollbackOnly() invocations, tracks it in the LocalManagedRuntime and reports on the cause is a commit() is attempted. Also attached is integration with the WLS Transaction's setRollbackOnly(Throwable) method. > Track the reason why a setRollbackOnly invocation was made > ---------------------------------------------------------- > > Key: OPENJPA-166 > URL: https://issues.apache.org/jira/browse/OPENJPA-166 > Project: OpenJPA > Issue Type: Improvement > Components: kernel > Affects Versions: 0.9.0, 0.9.6 > Reporter: Marc Prud'hommeaux > Priority: Minor > Attachments: OPENJPA-166.patch > > > Currently, when setRollbackOnly is invoked on a Broker or EntityManager, > there is no way to specify the cause or reason for the invocation. Given that > we invoke setRollbackOnly() whenever most PersistenceExceptions are thrown > (in org.apache.openjpa.persistence.PersistenceExceptions as per section 3.7 > of the JPA spec), transactions are frequently marked as RollbackOnly when > problems occur. If one part of an application swallows or otherwise handles > the exception, and another part of the application tries to subsequently > commit the transaction, it has no way of having any idea what caused the > problem. And even though the RollbackOnly flag can't be reset, it can be > useful for reporting purposes, or for application logic outside of the > transaction to know whether to re-try the entire operation. > Furthermore, this behavior can cause problems with managed JTA transactions, > since if an exception occurs during the flush or commit process (e.g., if a > duplicate primary key is persisted), the rollback only flag gets set on the > JTA transaction. Some TransactionManagers will check this flag at various > points in the commit process and eagerly fail when they see the RollbackOnly > flag, leaving the developer of the managed application with no way of knowing > what caused the transaction to fail. > I propose to add a new setRollbackOnly(Throwable cause) method to Broker and > EntityManager, where we can internally track the cause of the invocation. If > nothing else, then the application programmer can at least access it with a > getRollbackReason() method and act accordingly. Also, some TransactionManager > implementations (such as BEA's, which exhibits the behavior I described > earlier) have their own extensions for tracking the rollback reason, and we > might be able to integrate with them by sharing this knowledge. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.