I've had no problems with transactions, doing the type of thing that you describe, in earlier versions of JBoss and CMP... I haven't dealt much with BMP though, or JBoss versions past 2.4 beta, so maybe the issue is different. Have you trie posting your question on the forums?
You're right, app exceptions do not automatically cause a rollback. I think the idea is that, if it's an app exception, the bean should be given the chance to recover from the error. You can force a rollback though, by calling SetRollbackOnly before you throw your app exception. (Another way would be to just throw an EJBException, but that would kill your bean instance... SetRollbackOnly + an app exception keeps your bean instance.) Good luck, Mike ----- Original Message ----- From: "Eric Kaplan" <[EMAIL PROTECTED]> To: "David Jencks" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Wednesday, January 16, 2002 8:57 PM Subject: RE: [JBoss-user] Help needed with transactions > David > > Were there any more thoughts on this? I'm using declaritive transaction > management, both session and bmp entity beans have Required as their > transaction attribute, and the originating session bean throws an ejb > exception to the container when the insert fails. No luck on the integrity > of the transaction. > > Also, if it is that a bean throwing an application exception does not have > the transaction marked for rollback (is this correct?) can't i get myself in > trouble if i'm in the middle of a transaction and an application error > occurs? Or is it assumed that all application errors are generated before > any transactionality (ie beans are modified). > > Any help with this would be appreciated. > > Thanks > > Eric > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED]]On Behalf Of David Jencks > Sent: Tuesday, January 15, 2002 4:42 PM > To: [EMAIL PROTECTED] > Subject: Re: [JBoss-user] Help needed with transactions > > > Do you catch the exception in your session bean and call setRollbackOnly? > > david jencks > > On 2002.01.15 15:58:02 -0500 Eric Kaplan wrote: > > I have two entity beans that need to be updated within a transaction. In > > my > > case, I have a session bean which updates bean A, then tries to create a > > new > > bean B. If the creation of bean B fails (in this case, I violate a > > unique > > index restriction on the db), then I would expect that the modification > > of A > > would be rolled back. In my ejb-jar.xml, I have transaction attribute > > "Required" for all session and entity methods. The jboss log prints out: > > > > [Default] prepare insert > > [PortfolioEJB] TRANSACTION ROLLBACK EXCEPTION:null > > Embedded Exception > > ORA-00001: unique constraint (ABPDEV.NAME_INDEX) violated > > ; nested exception is: > > javax.ejb.EJBException: null > > Embedded Exception > > ORA-00001: unique constraint (ABPDEV.NAME_INDEX) violated > > > > [PortfolioEJB] java.sql.SQLException: ORA-00001: unique constraint > > (ABPDEV.NAME_ > > INDEX) violated > > [PortfolioEJB] > > [PortfolioEJB] at > > oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:1 > > 68) > > [PortfolioEJB] at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208) > > [PortfolioEJB] at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543) > > [PortfolioEJB] at > > oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405) > > > > [PortfolioEJB] at > > oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol. > > java:822) > > [PortfolioEJB] at > > oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStat > > ement.java:1446) > > [PortfolioEJB] at > > oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleState > > ment.java:1371) > > [PortfolioEJB] at > > oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(Oracl > > eStatement.java:1900) > > [PortfolioEJB] at > > oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(Orac > > lePreparedStatement.java:363) > > [PortfolioEJB] at > > com.armanta.ejb.SimpleJDBCAbstraction.insert(SimpleJDBCAbstra > > ction.java:39) > > [PortfolioEJB] at > > com.armanta.ejb.ValueContainerBean.create(ValueContainerBean. > > java:101) > > [PortfolioEJB] at > > com.armanta.ejb.portfolio.PortfolioBean.ejbCreate(PortfolioBe > > an.java:26) > > [PortfolioEJB] at java.lang.reflect.Method.invoke(Native Method) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.BMPPersistenceManager.createEntity(BMPP > > ersistenceManager.java:136) > > [PortfolioEJB] at > > org.jboss.ejb.EntityContainer.createHome(EntityContainer.java > > :616) > > [PortfolioEJB] at java.lang.reflect.Method.invoke(Native Method) > > [PortfolioEJB] at > > org.jboss.ejb.EntityContainer$ContainerInterceptor.invokeHome > > (EntityContainer.java:843) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke > > Home(EntitySynchronizationInterceptor.java:231) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(En > > tityInstanceInterceptor.java:154) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(Entity > > LockInterceptor.java:108) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.TxInterceptorCMT.invokeNext(TxIntercept > > orCMT.java:135) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(Tx > > InterceptorCMT.java:307) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxIntercept > > orCMT.java:86) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(Security > > Interceptor.java:103) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogIntercepto > > r.java:106) > > [PortfolioEJB] at > > org.jboss.ejb.EntityContainer.invokeHome(EntityContainer.java > > :420) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invoke > > Home(JRMPContainerInvoker.java:437) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invokeHome(Ho > > meProxy.java:237) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invoke(HomePr > > oxy.java:182) > > [PortfolioEJB] at $Proxy59.create(Unknown Source) > > [PortfolioEJB] at > > com.armanta.ejb.portfolio.PortfolioMasterBean.createNewPortfo > > lio(PortfolioMasterBean.java:28) > > [PortfolioEJB] at java.lang.reflect.Method.invoke(Native Method) > > [PortfolioEJB] at > > org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor. > > invoke(StatelessSessionContainer.java:543) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.TxInterceptorBMT.invoke(TxInterceptorBM > > T.java:276) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.inv > > oke(StatelessSessionInstanceInterceptor.java:87) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInte > > rceptor.java:128) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.ja > > va:195) > > [PortfolioEJB] at > > org.jboss.ejb.StatelessSessionContainer.invoke(StatelessSessi > > onContainer.java:286) > > [PortfolioEJB] at > > org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invoke > > (JRMPContainerInvoker.java:393) > > [PortfolioEJB] at java.lang.reflect.Method.invoke(Native Method) > > [PortfolioEJB] at sun.rmi.server.UnicastServerRef.dispatch(Unknown > > Source) > > [PortfolioEJB] at sun.rmi.transport.Transport$1.run(Unknown Source) > > [PortfolioEJB] at java.security.AccessController.doPrivileged(Native > > Method) > > [PortfolioEJB] at sun.rmi.transport.Transport.serviceCall(Unknown > > Source) > > [PortfolioEJB] at > sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown > > Sou > > rce) > > [PortfolioEJB] at > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unkn > > own Source) > > [PortfolioEJB] at java.lang.Thread.run(Unknown Source) > > > > In jboss.jcml, I set > > > > <mbean code="org.jboss.tm.TransactionManagerService" > > name="DefaultDomain:service=TransactionManager"> > > <attribute name="TransactionTimeout">300</attribute> > > > > <attribute name="XidClassName">oracle.jdbc.xa.OracleXid</attribute> > > </mbean> > > > > <mbean code="org.jboss.jdbc.JdbcProvider" > > name="DefaultDomain:service=JdbcProvider"> > > <attribute name="Drivers">oracle.jdbc.driver.OracleDriver</attribute> > > <!--attribute > > name="Drivers">oracle.jdbc.xa.client.OracleXADataSource</attribute--> > > </mbean> > > > > <mbean code="org.jboss.jdbc.XADataSourceLoader" > > name="DefaultDomain:service=XADataSource,name=ArmantaDevLocalJDBCPool"> > > <attribute name="PoolName">ArmantaDevLocalJDBCPool</attribute> > > <!--attribute > > > name="DataSourceClass">org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</attr > > ibute--> > > <attribute > > > name="DataSourceClass">oracle.jdbc.xa.client.OracleXADataSource</attribute> > > <attribute > > > name="URL">jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=localhost)(PROTOCOL > > =tcp)(PORT=1521))(CONNECT_DATA=(SID=dev)))</attribute> > > <attribute name="JDBCUser">abpdev</attribute> > > <attribute name="Password">abpdev</attribute> > > <attribute name="MinSize">2</attribute> > > <attribute name="MaxSize">10</attribute> > > <attribute name="IdleTimeoutEnabled">true</attribute> > > </mbean> > > > > In jboss.properties, I set: > > > > jboss.xa.xidclass=oracle.jdbc.xa.OracleXid > > > > Any ideas? It sure would be nice if transactions worked. > > > > Thanks > > > > -------------------------------------------------------------------------- > -- > > ---------- > > Eric Kaplan > > Armanta, Inc. > > 55 Madison Ave. > > Morristown, NJ 07960 > > Phone: (973) 326-9600 > > > > > > _______________________________________________ > JBoss-user mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/jboss-user > > > _______________________________________________ > JBoss-user mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/jboss-user > _______________________________________________ JBoss-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-user
