Two phase commit and bean managed transactions

To all the Transaction GURUS!
          Hi guys (-and gals).
          I've been doing J2EE for quite a while, but today was my first at
          XA-Transactions and Bean Managed Transactions.
          Why am I doing this?
          ====================
          Well I have to be able to controll the transactionalbehaviour of my
          bean
          during runtime, since some bean calls would cause a transactional
          overflow due to the stress they would cause to the system, whereas
          smaller bean calls need to run in one transaction.
          -> Therefore I need Bean Managed Transactions
          Since the bean does a call on two Database Connections it has to use a
          XA-Transaction.
          -> Therefore I need XA-Transactions.
          Abstract
          ========
          - I just can't get a User TransAction into the right Status it stays
          in 'STATUS_NO_TRANSACTION' all the time
          - Therefore the SQL Commands can be comitted 'java.sql.SQLException:
          Does not support SQL execution with no global transaction'
          - Therefore I can't do a rollback 'java.lang.IllegalStateException:
          Transaction does not exist'
          - Therefore I wrote this mail.
          I don't want to be a smart-"ass" writing such a detailed and indepth
          mail. I just would like to show that I tried, and would like to have
          some replies from you guys.
          Below are my configurations, code and logfiles.
          Thanx for taking your time and hope that the other people may learn
          something as well.
          cu
          Stefan
          Scenario
          ========
          used Software
          Bea Weblogic (WL) 6.0 SPx (not real sure which SP i have)
          Oracle 8.1.6 using the API-Version 8
          I configured the system as follows:
          (ofcourse I 'xxx'ed out all of the confidential data, sorry guys;-))
          excerpt from:
          config.xml
          <JDBCConnectionPool CapacityIncrement="5"
          DriverName="oracle.jdbc.driver.OracleDriver" InitialCapacity="2"
          LoginDelaySeconds="1" MaxCapacity="5" Name="oraclePool"
          Properties="user=xxx;password=xxx;dll=ocijdbc8;protocol=thin"
          RefreshMinutes="5" Targets="fbsserver" TestConnectionsOnRelease="true"
          TestTableName="languages" URL="jdbc:oracle:thin:@xxx:1521:xxx "/>
          <!-- Since this is our Main Datasource I would not like to use a XA
          Transaction due to performance Issues
          and the TxDataSource:
          -->
          <JDBCTxDataSource EnableTwoPhaseCommit="true"
          JNDIName="finstral.datasource.fbs" Name="finstral Content Datasource"
          PoolName="oraclePool" Targets="fbsserver"/>
          <!-- no comment required -I hope.
          Next comes the "special" Pool
          -->
          <JDBCConnectionPool CapacityIncrement="5"
          DriverName="weblogic.jdbc.oci.xa.XADataSource" InitialCapacity="1"
          LoginDelaySeconds="1" MaxCapacity="2" Name="oracleSecurityPool"
          Properties="user=xxx;password=xxx;server=xxx.xxx.xxx"
          RefreshMinutes="5" Targets="fbsserver" TestConnectionsOnRelease="true"
          TestTableName="Users" SupportsLocalTransaction="true"/>
          <!-- Well since there can only be one none XARessourceManager involved
          in a 2PC
          (keyword: Two Phase Commit) I will have to use a XACapable Driver for
          the other
          Datasource. Due to all the bugs in the oracle.xxx driver. I'll be
          using the jdriver for oci.
          I activated 'SupportsLocalTransaction' hoping it would solve my
          problem - without effect. I just left in there now, since it made
          sense me. Not?
          Again the TxDataSource:
          -->
          <JDBCTxDataSource EnableTwoPhaseCommit="true"
          JNDIName="finstral.datasource.fbssecurity" Name="finstral Security
          Datasource" PoolName="oracleSecurityPool" Targets="fbsserver"/>
          <!-- The System starts right up and can locate the test tables and
          everything. So I think all of this stuff is working here -->
          ejb-jar.xml
          <ejb-jar>
               <enterprise-beans>
                    <session>
                         <ejb-name>TPCTestBean</ejb-name>
          <home>de.sitewaerts.futuna.common.test.tpcbean.TPCHome</home>
          <remote>de.sitewaerts.futuna.common.test.tpcbean.TPC</remote>
          <ejb-class>de.sitewaerts.futuna.common.test.tpcbean.TPCBean</ejb-class>
                         <session-type>Stateless</session-type>
                         <transaction-type>Bean</transaction-type>
                    </session>
               </enterprise-beans>
               <assembly-descriptor/>
          </ejb-jar>
          <!-- Originally I had the assembly-descriptor full of transaction
          requirements. I thought since
          the bean is handling all of the transaction stuff itself, it might get
          confused by the 'container-transaction'
          properties, and deleted them. Do I need them anyway?-->
          weblogic-ejb-jar.xml
          <weblogic-ejb-jar>
               <weblogic-enterprise-bean>
                    <ejb-name>TPCTestBean</ejb-name>
                    <stateless-session-descriptor/>
                    <jndi-name>finstral/ejb/test_tpc</jndi-name>
               </weblogic-enterprise-bean>
          </weblogic-ejb-jar>
          <!-- Nothing I have to explain here -->
          BeanCode (from the implementingBeanClass:
          'de.sitewaerts.futuna.common.test.tpcbean.TPCBean')
          public void setupTables() throws RemoteException
          UserTransaction tx = getTransaction();
          //getTransaction calls: 'tx = sCtx.getUserTransaction()' and does
          some errorhandling
          log.info("Die Transaktion vor den Connections: "+tx.toString());
          //Sorry bout the German. You should get the Message though.
          log.info("Der Transaktionsstatus vor den Connections:
          "+transactionStatus(tx));
          Connection conSecurity = getConnection(DATASOURCE_SECURITY, tx);
          //gets a Connection via a DataSourceName from the JNDI tree
          Connection conContent = getConnection(DATASOURCE_CONTENT, tx);
          log.info("Die frische Connection conSecurity: "+conSecurity);
          log.info("Die frische Connection conContent: "+conContent);
          tearDownTable(conSecurity);
          //Does nothing special
          tearDownTable(conContent);
          log.info("Die Transaktion nach dem Teardown: "+tx.toString());
          log.info("Der Transaktionsstatus nach dem Teardown:
          "+transactionStatus(tx));
          Statement stmt = null;
          try
          stmt = conSecurity.createStatement();
          //Well its getting interesting now.....
          log.info("Die Transaktion vor dem createtable: "+tx.toString());
          log.info("Der Transaktionsstatus vor dem createtable:
          "+transactionStatus(tx));
          log.info("Die Connection conSecurity vor dem createtable:
          "+conSecurity);
          log.info("Die Connection conContent vor dem createtable:
          "+conContent);
          stmt.executeUpdate(CREATE_TABLE);
          //above is the row 91 -> throws: 'java.sql.SQLException: Does
          not support SQL execution with no global transaction'
          stmt.close();
          stmt = conContent.createStatement();
          stmt.executeUpdate(CREATE_TABLE);
          stmt.close();
          commitTransaction(tx);
          catch (SQLException sqle)
          log.error("Konnte kein table init machen", sqle);
          rollbackTransaction(tx);
          //The Code for this method is below
          throw new EJBException(sqle);
          finally
          closeConnection(conSecurity);
          closeConnection(conContent);
          protected void rollbackTransaction(UserTransaction tx)
          log.info("Der Transaktionsstatus vor dem Rollback:
          "+transactionStatus(tx));
          log.info("Die Transaktion vor dem Rollback: "+tx.toString());
          try
          tx.rollback();
          //above is row 200 -> throws: 'java.lang.IllegalStateException:
          Transaction does not exist'
          log.info("Der Transaktionsstatus nach dem Rollback:
          "+transactionStatus(tx));
          log.info("Die Transaktion nach dem Rollback: "+tx.toString());
          catch (Exception e)
          log.error("Konnte die Transaktion nicht backrollen.", e);
          throw new EJBException(e);
          Log Excerpt
          ===========
          INFO setupTables() (66) - Die Transaktion vor den Connections:
          [email protected]
          INFO setupTables() (67) - Der Transaktionsstatus vor den Connections:
          STATUS_NO_TRANSACTION
          INFO setupTables() (72) - Die frische Connection conSecurity:
          weblogic.jdbc.rmi.SerialConnection@7c6daa
          INFO setupTables() (73) - Die frische Connection conContent:
          weblogic.jdbc.rmi.SerialConnection@3b425
          INFO setupTables() (78) - Die Transaktion nach dem Teardown:
          [email protected]
          INFO setupTables() (79) - Der Transaktionsstatus nach dem Teardown:
          STATUS_NO_TRANSACTION
          INFO setupTables() (86) - Die Transaktion vor dem createtable:
          [email protected]
          INFO setupTables() (87) - Der Transaktionsstatus vor dem createtable:
          STATUS_NO_TRANSACTION
          INFO setupTables() (88) - Die Connection conSecurity vor dem
          createtable: weblogic.jdbc.rmi.SerialConnection@7c6daa
          INFO setupTables() (89) - Die Connection conContent vor dem
          createtable: weblogic.jdbc.rmi.SerialConnection@3b425
          ERROR setupTables() (101) - Konnte kein table init machen
          java.sql.SQLException: Does not support SQL execution with no global
          transaction
               at
          weblogic.jdbc.oci.xa.XAConnection.beforeExecute(XAConnection.java:137)
               at
          weblogic.jdbc.oci.xa.Statement.executeUpdate(Statement.java:112)
               at weblogic.jdbc.jta.Statement.executeUpdate(Statement.java:185)
               at
          weblogic.jdbc.rmi.internal.StatementImpl.executeUpdate(StatementImpl.jav
          a:42)
               at
          weblogic.jdbc.rmi.SerialStatement.executeUpdate(SerialStatement.java:54)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBean.setupTables(TPCBean.jav
          a:91)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBeanImpl.setupTables(TPCBean
          Impl.java:130)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBeanEOImpl.setupTables(TPCBe
          anEOImpl.java:64)
               at
          de.sitewaerts.futuna.common.test.TwoPhaseCommitUnitTest.setUp(TwoPhaseCo
          mmitUnitTest.java:51)
               at
          org.apache.commons.cactus.AbstractTestCase.runBareServerTest(AbstractTes
          tCase.java:297)
               at
          org.apache.commons.cactus.server.ServletTestCaller.callTestMethod(Servle
          tTestCaller.java:148)
               at
          org.apache.commons.cactus.server.ServletTestCaller.doTest(ServletTestCal
          ler.java:199)
               at
          org.apache.commons.cactus.server.ServletTestRedirector.doPost(ServletTes
          tRedirector.java:149)
               at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
               at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
               at
          weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.
          java:213)
               at
          weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServl
          etContext.java:1265)
               at
          weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.
          java:1631)
               at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
               at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
          INFO rollbackTransaction() (196) - Der Transaktionsstatus vor dem
          Rollback: STATUS_NO_TRANSACTION
          INFO rollbackTransaction() (197) - Die Transaktion vor dem Rollback:
          [email protected]
          ERROR rollbackTransaction() (206) - Konnte die Transaktion nicht
          backrollen.
          java.lang.IllegalStateException: Transaction does not exist
               at
          weblogic.transaction.internal.TransactionManagerImpl.rollback(Transactio
          nManagerImpl.java:228)
               at
          weblogic.transaction.internal.TransactionManagerImpl.rollback(Transactio
          nManagerImpl.java:222)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBean.rollbackTransaction(TPC
          Bean.java:200)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBean.setupTables(TPCBean.jav
          a:102)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBeanImpl.setupTables(TPCBean
          Impl.java:130)
               at
          de.sitewaerts.futuna.common.test.tpcbean.TPCBeanEOImpl.setupTables(TPCBe
          anEOImpl.java:64)
               at
          de.sitewaerts.futuna.common.test.TwoPhaseCommitUnitTest.setUp(TwoPhaseCo
          mmitUnitTest.java:51)
               at
          org.apache.commons.cactus.AbstractTestCase.runBareServerTest(AbstractTes
          tCase.java:297)
               at
          org.apache.commons.cactus.server.ServletTestCaller.callTestMethod(Servle
          tTestCaller.java:148)
               at
          org.apache.commons.cactus.server.ServletTestCaller.doTest(ServletTestCal
          ler.java:199)
               at
          org.apache.commons.cactus.server.ServletTestRedirector.doPost(ServletTes
          tRedirector.java:149)
               at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
               at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
               at
          weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.
          java:213)
               at
          weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServl
          etContext.java:1265)
               at
          weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.
          java:1631)
               at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
               at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
          CONCLUSION
          ==========
          I'm going nuts.
          I just don't get it.
          The transaction is the same. I don't change the Connection. I start
          the Transaction at the beginning before I do anything!
          Please guys help me out.
          Thx alot.
          Stefan "it's three o'clock in the morning, my girlfriend left me, and
          my only friend is that stupid linux pinguine" Siprell
          Software-Development
          <<<<<<<<<<<<<<<<<<<<<<<<<<<
          <sitewaerts> GmbH
          Hebelstraße 15
          D-76131 Karlsruhe
          Tel: +49 (721) 920 918 22
          Fax: +49 (721) 920 918 29
          http://www.sitewaerts.de
          >>>>>>>>>>>>>>>>>>>>>>>>>>>
          

Hi Priscilla
          (did you ever see the movie ? :-))
          Well I moved away from the idea of using bean managed transaction. I'll
          be using Container Managed Transactions. To modify the
          transactionalbehaviour I'll write proxymethods which have certain
          different containermanaged transaction properties, but which all call
          the same private methods.
          But it works! Here is my experience:
          - I was doing a DDL statement: I was trying to create new Tables, which
          is a definite "no-go"
          - pay careful attention to:
          http://edocs.bea.com/wls/docs60/jta/trxejb.html#1051405
                    and
          http://edocs.bea.com/wls/docs60/jta/trxejb.html#1051741
          and use these Settings for the Pool, don't ask me why, but it took me
          hours to find it out by myself:
               <JDBCConnectionPool CapacityIncrement="5"
          DriverName="weblogic.jdbc.oci.xa.XADataSource" InitialCapacity="1"
          LoginDelaySeconds="1" MaxCapacity="2" Name="oracleSecurityPool"
          Properties="user=xxx; password=xxx; server=xxx.xxx.xxx"
          RefreshMinutes="5" Targets="fbsserver" TestConnectionsOnRelease="true"
          TestTableName="Users" SupportsLocalTransaction="true"/>
          where as the server (shown as: xxx.xxx.xxx) is the TNS Name of the
          Oracle Driver.
          It works great.
          Another thing you guys might want to do is write a simple StatelessSB
          which does JDBC calls and two different database Connections.
          Then write a UnitTest which calls this bean a couple hundred times (with
          the same transaction). Have one test do clean writes, and another which
          causes some SQL-Exception (too long Data Columns, or likewise).
          Always count the entries and see if everything worked out. We're using
          this SetupConstruction to test new combinations of AS(sorry Priscilla) /
          Database / Db-Drivers to have a "standard test".
          I know my two cents were uncalled for, but it might save you some
          time.....
          thanx for your help
          Stefan
          -----Ursprüngliche Nachricht-----
          Von: Priscilla Fung [mailto:[email protected]]
          Bereitgestellt: Donnerstag, 2. August 2001 21:42
          Bereitgestellt in: transaction
          Unterhaltung: Two phase commit and bean managed transactions
          Betreff: Re: Two phase commit and bean managed transactions
          Hi Stefan,
          Looks like you have not actually begun a transaction by calling
          UserTransaction.begin(),
          so your setupTables method is really executing with no transaction
          context.
          Priscilla
          Stefan Siprell <[email protected]> wrote:
          >To all the Transaction GURUS!
          >
          >Hi guys (-and gals).
          >I've been doing J2EE for quite a while, but today was my first at
          >XA-Transactions and Bean Managed Transactions.
          >
          >Why am I doing this?
          >====================
          >Well I have to be able to controll the transactionalbehaviour of my
          >bean
          >during runtime, since some bean calls would cause a transactional
          >overflow due to the stress they would cause to the system, whereas
          >smaller bean calls need to run in one transaction.
          >-> Therefore I need Bean Managed Transactions
          >Since the bean does a call on two Database Connections it has to use
          >a
          >XA-Transaction.
          >-> Therefore I need XA-Transactions.
          >
          >Abstract
          >========
          >- I just can't get a User TransAction into the right Status it stays
          >in 'STATUS_NO_TRANSACTION' all the time
          >- Therefore the SQL Commands can be comitted 'java.sql.SQLException:
          >Does not support SQL execution with no global transaction'
          >- Therefore I can't do a rollback 'java.lang.IllegalStateException:
          >Transaction does not exist'
          >- Therefore I wrote this mail.
          >
          >I don't want to be a smart-"ass" writing such a detailed and indepth
          >mail. I just would like to show that I tried, and would like to have
          >some replies from you guys.
          >
          >Below are my configurations, code and logfiles.
          >
          >Thanx for taking your time and hope that the other people may learn
          >something as well.
          >
          >cu
          >
          >Stefan
          >
          >
          >Scenario
          >========
          >
          >used Software
          >-------------
          >Bea Weblogic (WL) 6.0 SPx (not real sure which SP i have)
          >Oracle 8.1.6 using the API-Version 8
          >
          >
          >I configured the system as follows:
          >(ofcourse I 'xxx'ed out all of the confidential data, sorry guys;-))
          >excerpt from:
          >
          >config.xml
          >----------
          ><JDBCConnectionPool CapacityIncrement="5"
          >DriverName="oracle.jdbc.driver.OracleDriver" InitialCapacity="2"
          >LoginDelaySeconds="1" MaxCapacity="5" Name="oraclePool"
          >Properties="user=xxx;password=xxx;dll=ocijdbc8;protocol=thin"
          >RefreshMinutes="5" Targets="fbsserver" TestConnectionsOnRelease="true"
          >TestTableName="languages" URL="jdbc:oracle:thin:@xxx:1521:xxx "/>
          >
          ><!-- Since this is our Main Datasource I would not like to use a XA
          >Transaction due to performance Issues
          >and the TxDataSource:
          >-->
          >
          ><JDBCTxDataSource EnableTwoPhaseCommit="true"
          >JNDIName="finstral.datasource.fbs" Name="finstral Content Datasource"
          >PoolName="oraclePool" Targets="fbsserver"/>
          >
          ><!-- no comment required -I hope.
          >Next comes the "special" Pool
          >-->
          >
          ><JDBCConnectionPool CapacityIncrement="5"
          >DriverName="weblogic.jdbc.oci.xa.XADataSource" InitialCapacity="1"
          >LoginDelaySeconds="1" MaxCapacity="2" Name="oracleSecurityPool"
          >Properties="user=xxx;password=xxx;server=xxx.xxx.xxx"
          >RefreshMinutes="5" Targets="fbsserver" TestConnectionsOnRelease="true"
          >TestTableName="Users" SupportsLocalTransaction="true"/>
          >
          ><!-- Well since there can only be one none XARessourceManager involved
          >in a 2PC
          >(keyword: Two Phase Commit) I will have to use a XACapable Driver for
          >the other
          >Datasource. Due to all the bugs in the oracle.xxx driver. I'll be
          >using the jdriver for oci.
          >I activated 'SupportsLocalTransaction' hoping it would solve my
          >problem - without effect. I just left in there now, since it made
          >sense me. Not?
          >Again the TxDataSource:
          >-->
          >
          ><JDBCTxDataSource EnableTwoPhaseCommit="true"
          >JNDIName="finstral.datasource.fbssecurity" Name="finstral Security
          >Datasource" PoolName="oracleSecurityPool" Targets="fbsserver"/>
          >
          ><!-- The System starts right up and can locate the test tables and
          >everything. So I think all of this stuff is working here -->
          >
          >
          >
          >ejb-jar.xml
          >-----------
          ><ejb-jar>
          >     <enterprise-beans>
          >          <session>
          >               <ejb-name>TPCTestBean</ejb-name>
          >     
          ><home>de.sitewaerts.futuna.common.test.tpcbean.TPCHome</home>
          >     
          ><remote>de.sitewaerts.futuna.common.test.tpcbean.TPC</remote>
          >     
          ><ejb-class>de.sitewaerts.futuna.common.test.tpcbean.TPCBean</ejb-class>
          >               <session-type>Stateless</session-type>
          >               <transaction-type>Bean</transaction-type>
          >          </session>
          >     </enterprise-beans>
          >     <assembly-descriptor/>
          ></ejb-jar>
          >
          ><!-- Originally I had the assembly-descriptor full of transaction
          >requirements. I thought since
          >the bean is handling all of the transaction stuff itself, it might get
          >confused by the 'container-transaction'
          >properties, and deleted them. Do I need them anyway?-->
          >
          >weblogic-ejb-jar.xml
          >--------------------
          ><weblogic-ejb-jar>
          >     <weblogic-enterprise-bean>
          >          <ejb-name>TPCTestBean</ejb-name>
          >          <stateless-session-descriptor/>
          >          <jndi-name>finstral/ejb/test_tpc</jndi-name>
          >     </weblogic-enterprise-bean>
          ></weblogic-ejb-jar>
          >
          ><!-- Nothing I have to explain here -->
          >
          >BeanCode (from the implementingBeanClass:
          >'de.sitewaerts.futuna.common.test.tpcbean.TPCBean')
          >-----------------------------------------------------------------------
          >---------------------
          >
          > public void setupTables() throws RemoteException
          > {
          > UserTransaction tx = getTransaction();
          > //getTransaction calls: 'tx = sCtx.getUserTransaction()' and does
          >some errorhandling
          >
          > log.info("Die Transaktion vor den Connections: "+tx.toString());
          > //Sorry bout the German. You should get the Message though.
          > log.info("Der Transaktionsstatus vor den Connections:
          >"+transactionStatus(tx));
          >
          > Connection conSecurity = getConnection(DATASOURCE_SECURITY, tx);
          > //gets a Connection via a DataSourceName from the JNDI tree
          > Connection conContent = getConnection(DATASOURCE_CONTENT, tx);
          >
          > log.info("Die frische Connection conSecurity: "+conSecurity);
          > log.info("Die frische Connection conContent: "+conContent);
          >
          > tearDownTable(conSecurity);
          > //Does nothing special
          > tearDownTable(conContent);
          >
          > log.info("Die Transaktion nach dem Teardown: "+tx.toString());
          > log.info("Der Transaktionsstatus nach dem Teardown:
          >"+transactionStatus(tx));
          >
          > Statement stmt = null;
          > try
          > {
          > stmt = conSecurity.createStatement();
          > //Well its getting interesting now.....
          >
          > log.info("Die Transaktion vor dem createtable: "+tx.toString());
          > log.info("Der Transaktionsstatus vor dem createtable:
          >"+transactionStatus(tx));
          > log.info("Die Connection conSecurity vor dem createtable:
          >"+conSecurity);
          > log.info("Die Connection conContent vor dem createtable:
          >"+conContent);
          >
          > stmt.executeUpdate(CREATE_TABLE);
          > //above is the row 91 -> throws: 'java.sql.SQLException: Does
          >not support SQL execution with no global transaction'
          >
          > stmt.close();
          >
          > stmt = conContent.createStatement();
          > stmt.executeUpdate(CREATE_TABLE);
          > stmt.close();
          > commitTransaction(tx);
          > }
          > catch (SQLException sqle)
          > {
          > log.error("Konnte kein table init machen", sqle);
          > rollbackTransaction(tx);
          > //The Code for this method is below
          > throw new EJBException(sqle);
          > }
          > finally
          > {
          > closeConnection(conSecurity);
          > closeConnection(conContent);
          > }
          > }
          >
          > protected void rollbackTransaction(UserTransaction tx)
          > {
          > log.info("Der Transaktionsstatus vor dem Rollback:
          >"+transactionStatus(tx));
          > log.info("Die Transaktion vor dem Rollback: "+tx.toString());
          > try
          > {
          > tx.rollback();
          > //above is row 200 -> throws: 'java.lang.IllegalStateException:
          >Transaction does not exist'
          > log.info("Der Transaktionsstatus nach dem Rollback:
          >"+transactionStatus(tx));
          > log.info("Die Transaktion nach dem Rollback: "+tx.toString());
          > }
          > catch (Exception e)
          > {
          > log.error("Konnte die Transaktion nicht backrollen.", e);
          > throw new EJBException(e);
          > }
          > }
          >
          >Log Excerpt
          >===========
          >INFO setupTables() (66) - Die Transaktion vor den Connections:
          >[email protected]
          >INFO setupTables() (67) - Der Transaktionsstatus vor den Connections:
          >STATUS_NO_TRANSACTION
          >INFO setupTables() (72) - Die frische Connection conSecurity:
          >weblogic.jdbc.rmi.SerialConnection@7c6daa
          >INFO setupTables() (73) - Die frische Connection conContent:
          >weblogic.jdbc.rmi.SerialConnection@3b425
          >INFO setupTables() (78) - Die Transaktion nach dem Teardown:
          >[email protected]
          >INFO setupTables() (79) - Der Transaktionsstatus nach dem Teardown:
          >STATUS_NO_TRANSACTION
          >INFO setupTables() (86) - Die Transaktion vor dem createtable:
          >[email protected]
          >INFO setupTables() (87) - Der Transaktionsstatus vor dem createtable:
          >STATUS_NO_TRANSACTION
          >INFO setupTables() (88) - Die Connection conSecurity vor dem
          >createtable: weblogic.jdbc.rmi.SerialConnection@7c6daa
          >INFO setupTables() (89) - Die Connection conContent vor dem
          >createtable: weblogic.jdbc.rmi.SerialConnection@3b425
          >ERROR setupTables() (101) - Konnte kein table init machen
          >java.sql.SQLException: Does not support SQL execution with no global
          >transaction
          >     at
          >weblogic.jdbc.oci.xa.XAConnection.beforeExecute(XAConnection.java:137)
          >     at
          >weblogic.jdbc.oci.xa.Statement.executeUpdate(Statement.java:112)
          >     at weblogic.jdbc.jta.Statement.executeUpdate(Statement.java:185)
          >     at
          >weblogic.jdbc.rmi.internal.StatementImpl.executeUpdate(StatementImpl.ja
          v
          >a:42)
          >     at
          >weblogic.jdbc.rmi.SerialStatement.executeUpdate(SerialStatement.java:54
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBean.setupTables(TPCBean.ja
          v
          >a:91)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBeanImpl.setupTables(TPCBea
          n
          >Impl.java:130)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBeanEOImpl.setupTables(TPCB
          e
          >anEOImpl.java:64)
          >     at
          >de.sitewaerts.futuna.common.test.TwoPhaseCommitUnitTest.setUp(TwoPhaseC
          o
          >mmitUnitTest.java:51)
          >     at
          >org.apache.commons.cactus.AbstractTestCase.runBareServerTest(AbstractTe
          s
          >tCase.java:297)
          >     at
          >org.apache.commons.cactus.server.ServletTestCaller.callTestMethod(Servl
          e
          >tTestCaller.java:148)
          >     at
          >org.apache.commons.cactus.server.ServletTestCaller.doTest(ServletTestCa
          l
          >ler.java:199)
          >     at
          >org.apache.commons.cactus.server.ServletTestRedirector.doPost(ServletTe
          s
          >tRedirector.java:149)
          >     at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
          >     at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
          >     at
          >weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl
          >java:213)
          >     at
          >weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServ
          l
          >etContext.java:1265)
          >     at
          >weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl
          >java:1631)
          >     at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
          >     at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
          >INFO rollbackTransaction() (196) - Der Transaktionsstatus vor dem
          >Rollback: STATUS_NO_TRANSACTION
          >INFO rollbackTransaction() (197) - Die Transaktion vor dem Rollback:
          >[email protected]
          >ERROR rollbackTransaction() (206) - Konnte die Transaktion nicht
          >backrollen.
          >java.lang.IllegalStateException: Transaction does not exist
          >     at
          >weblogic.transaction.internal.TransactionManagerImpl.rollback(Transacti
          o
          >nManagerImpl.java:228)
          >     at
          >weblogic.transaction.internal.TransactionManagerImpl.rollback(Transacti
          o
          >nManagerImpl.java:222)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBean.rollbackTransaction(TP
          C
          >Bean.java:200)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBean.setupTables(TPCBean.ja
          v
          >a:102)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBeanImpl.setupTables(TPCBea
          n
          >Impl.java:130)
          >     at
          >de.sitewaerts.futuna.common.test.tpcbean.TPCBeanEOImpl.setupTables(TPCB
          e
          >anEOImpl.java:64)
          >     at
          >de.sitewaerts.futuna.common.test.TwoPhaseCommitUnitTest.setUp(TwoPhaseC
          o
          >mmitUnitTest.java:51)
          >     at
          >org.apache.commons.cactus.AbstractTestCase.runBareServerTest(AbstractTe
          s
          >tCase.java:297)
          >     at
          >org.apache.commons.cactus.server.ServletTestCaller.callTestMethod(Servl
          e
          >tTestCaller.java:148)
          >     at
          >org.apache.commons.cactus.server.ServletTestCaller.doTest(ServletTestCa
          l
          >ler.java:199)
          >     at
          >org.apache.commons.cactus.server.ServletTestRedirector.doPost(ServletTe
          s
          >tRedirector.java:149)
          >     at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
          >     at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
          >     at
          >weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl
          >java:213)
          >     at
          >weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServ
          l
          >etContext.java:1265)
          >     at
          >weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl
          >java:1631)
          >     at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
          >     at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
          >
          >
          >CONCLUSION
          >==========
          >I'm going nuts.
          >I just don't get it.
          >The transaction is the same. I don't change the Connection. I start
          >the Transaction at the beginning before I do anything!
          >Please guys help me out.
          >Thx alot.
          >
          >Stefan "it's three o'clock in the morning, my girlfriend left me, and
          >my only friend is that stupid linux pinguine" Siprell
          >Software-Development
          ><<<<<<<<<<<<<<<<<<<<<<<<<<<
          ><sitewaerts> GmbH
          >Hebelstraße 15
          >D-76131 Karlsruhe
          >
          >Tel: +49 (721) 920 918 22
          >Fax: +49 (721) 920 918 29
          >http://www.sitewaerts.de
          >>>>>>>>>>>>>>>>>>>>>>>>>>>>
          >
          >
          >
          

Similar Messages

  • About Container-managed Transactions and Bean-managed Transactions

    as the document of weblogic7.0 describe the differents of Container-managed
              Transactions and Bean-managed Transactions,and in the document,It tell us
              details of using Bean-managed Transactions,such as \:
              import javax.naming.*;import javax.transaction.UserTransaction;.....
              import java.sql.*;import java.util.*;
              UserTransaction tx = (UserTransaction)
              ctx.lookup("javax.transaction.UserTransaction");tx.begin();
              tx.commit() //or tx.rollback
              but how to use Container-managed Transactions?
              what is EJB's deployment descriptor? can someone tell me?
              i wonder someone will show me an example of how to use Container-managed
              Transactions.
              thanks
              fish
              

    Many if not all of the WLS EJB examples use container-managed
              transactions. That's a good place to start.
              I'd also recommend that you pick up a decent EJB book. There's several
              on the market right now.
              -- Rob
              fish wrote:
              > <ejb-jar>
              > <enterprise-beans>
              > <session>
              > <ejb-name>testbean</ejb-name>
              > <home>test.test.TestHome</home>
              > <remote>test.test.Test</remote>
              > <ejb-class>test.test.TestBean</ejb-class>
              > <session-type>Stateful</session-type>
              > <transaction-type>Container</transaction-type>
              > </session>
              > </enterprise-beans>
              >
              > <assembly-descriptor>
              > <container-transaction>
              > <method>
              > <ejb-name>EmployeeRecord</ejb-name>
              > <method-name>*</method-name>
              > </method>
              > <trans-attribute>Required</trans-attribute>
              > </container-transaction>
              > </assembly-descriptor>
              > </ejb-jar>
              > ----------------------------------------------
              > seems i have to write ejb-jar.xml like this,am i right?
              > what about <ejb-client-jar>? is it needed in this xml file?
              >
              > thanks
              >
              > fish
              >
              >
              

  • SAP Transaction in Two phase Commit ?

    Hi all,
    When we make a connection to SAP system from .NET application using .NET connector, we can make calls to transactional BAPI/RFC’s. But is there any way in which we can make SAP transaction take part in MS DTC (Microsoft Distributed Transaction Coordinator) transactions?
    We want to implement a two phase commit and hence this question. Please let us know if you are aware of any mechanism using which we can implement a two phase commit.
    The call scenario is described below:
    TransactionScope
    1.     SQL_StoredProc1();
    2.     SQL_StoresProc2();
         10.           SAP_TransactionBAPI();
         11.          SQLStoredProcn();
          12.           SQLTransaction_Commit();
          13.      SAPTransaction_Commit();
    Exception ()
    SQLTransaction_Rollback();
    SAPTransaction_Rollback();
    In the above case all the statements have to be executed successfully or they have to be rolled back. Let’s think of the situation where all the statements up to line 13 have been executed successfully, but there was a failure during the commit of SAP, and then we have to rollback the SQL transaction also which is already committed.
    This situation can be handled if and only if SAP transaction manager follows XA transaction protocol and it can include itself in MSDTC. So that every transaction manager votes for the commit (it can be called half commit) if the transaction is successful otherwise all the transactions should be rolled back.
    Can anybody tell me the way to include SAP transaction manager in MSDTC if it at all possible?

    Hi Saket,
    I did  not understand much of your query but just wanted to know how are you making a connection to the backend here?
    If using DataSources and if the datasource is configured directly in the EP server (using Visual Administrator), you have an option of the required 2-way commit.
    The datasource takes care of it directly. Apart from this, the datasource will also take cre of the connection pooling.
    Hope this helps.
    Awaiting Reply.
    Warm Regards,
    Ritu

  • Container-managed / bean-managed transaction demarcation

    I am trying to make sure I understand container-managed and bean-managed transaction demarcation and in particular where you have one bean calling another bean. What happens where one of the beans has container-managed transaction demarcation and the other bean-managed transaction demarcation. In fact the initial question to ask is, is this allowed?
    Lets use an application scenario to illustrate the issue. The application has a payment transaction. Payments can be received in one of two ways:
    1. As a payment at a branch where the individual payment is processed on a client application and resulting in the processing of a single payment transaction.
    2. As a batch of payments received from a bank containing, potentially, thousands of payment transactions.
    The proposed implementation for this uses two session beans. The first is a Payment session bean that implements the business logic as appropriate calling entity beans to persist the change. The second is a BatchPayment session bean. This processes the batch of payment transactions received from the bank. The BatchPayment reads through the batch of payments from a bank calling the Payment session bean for each payment transaction.
    Lets look at the transactional properties of both session beans. In order to support the client application the Payment session bean can implicitly enforce transactional integrity and is therefore set to container-managed transaction demarcation. However the BatchPayment session bean will want to explicitly specify transaction demarcation for performance reasons. The transactional "commit" process is relatively expensive. When processing a large batch of transactions rather than performing a commit after every transaction is processed we want to perform the commit after a number of transactions have been processed. For example, we may decide that after every 100 transactions have been processed we commit. The processing will have a shorter elapsed time as we have not had to perform 99 commit processes. So the BatchPayment session bean will want to explicitly specify its transaction demarcation and will therefore be defined with bean-managed transaction demarcation.
    How would this be implemented? A possible solution is:
    Payment session bean implemented with container-managed transaction demarcation with transaction scope set to Required.
    BatchPayment session bean implemented with bean-managed transaction demarcation with transaction scope set to Required.
    When the client application is run it calls the Payment bean and the container-managed transaction demarcation ensures the transactional integrity of that transaction.
    When a BatchPayment process is run it explicitly determines the transaction demarcation. Lets say that after every 100 Payment transactions (through 100 calls to the Payment session bean) have been processed the BatchPayment bean issues a commit. In this scenario however we have mixed container-managed and bean-managed transaction demarcation. Hence my original question. Can container-managed and bean-managed transaction demarcation be mixed? If not how is it possible to implement the requirements as described above?
    Thanks for any thoughts.
    Paul

    BatchPayment session bean implemented with bean-managed transaction demarcation with transaction scope set to Required.Didn't quite understand this sentence.... if it's BMT it has no declarative transaction attributes such as "Required"....
    Anyway, first of all I'll have to ask, Why at all would you want to commit in the middle of the business method? to get as much through as possible before a potential crash? :-)
    Can container-managed and bean-managed transaction demarcation be mixed?Yes, of course. Just remember that the "direction" you are refering to ->
    a BMT SB that propagates it's transaction to a method in a CMT SB that is demarcated with "Required" is the simplest case. If it were "reversed", or for that matter any BMT that might be called within an active transaction context must perform logic to manipulate the transaction state. For instance(and most common case), checking to see if a transaction is active and if so not to do anything(just use the one that is already active).
    If not how is it possible to implement the requirements as described above?You could also implement this scenario with CMTs all the way through. your BatchPayment SB could consist of two methods, one (say, execute(Collection paymentsToExecute) ) with "Supports", and another(say executeBatchUnit(Collection paymentsToExecute, int beginIndex, int endIndex) ) with "RequiresNew".
    then have the first just call the other with indexes denoting each time a group of payments.
    Still, it does seem more suitable using BMT for these kind of things.....
    Hope this helped....

  • Data-source.xml -  BaseResourceException - two phase commit

    Hi,
    I am seeing the following exception.   Please let me know how to fix this.
    thanks
    Sunita
    com.sap.engine.services.connector.exceptions.BaseResourceException: The resource "xxx" does not support two-phase commit and cannot be enlisted in the current transaction, because another non supporting two-phase commit resource is already enlisted for component "webContainer/applications/JavaEE/YY-TPRO/YYr-TPRO" in application "JavaEE/YY-TPRO". Only one of the enlisted resources is allowed to be non two-phase commit compliant.
    I am using JDBC 1.x datasource, and the .xml looks like this:
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE data-sources SYSTEM 'data-sources.dtd'>
    <data-sources>
      <application-name>JavaEE/yy-TPRO</application-name>
      <data-source>
        <data-source-name>xxx</data-source-name>
        <alias>jdbc/xxyyDB/TPRO</alias>
        <driver-name>OracleThin</driver-name>
        <init-connections>1</init-connections>
        <max-connections>20</max-connections>
        <max-time-to-wait-connection>60</max-time-to-wait-connection>
        <sql-engine>vendor_sql</sql-engine>
        <jdbc-1.x>
          <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
          <url>jdbc:oracle:thin:@sol-mercury:1521:hermes</url>
          <user-name>abcd</user-name>
          <password>abcd</password>
        </jdbc-1.x>
      </data-source>
    </data-sources>

    HI,
    Thanks for the response, I already went through these threads.
    My exception seems to be related to this - Problem with connection sharing if J2EE transaction is running
    and suggested solutions seems to be:
    The problem is caused when there is an inappropriate attempt to open a second connection in an active JTA transaction. There is either an attempt to get a second connection from an un-shareable non-XA DataSource or an attempt to get it from another non-XA DataSource. You have to:
    &#9679;     Use no more than one connection from this data source while the JTA transaction is active or
    &#9679;     Declare the data source as shareable, depending on your application logic.
    Question is, How can I make data source as shareable?? 
    This application worked fine in JBoss, weblogic and now we are trying to port it to NetWeaver.
    Is any of the above options are configurable in data-sources.xml?
    Thanks for your guidance and response.
    Surekha

  • Weblogic Two Phase commit

    Dears,
    we are facing slowness problem while migration application from weblogic 7 to weblogic 11g.
    Our Application use EJB 2.1 CMP and oracle database
    In web-logic 7 we use global transaction and emulate two phase commit .Our application works fine
    If we set global transaction as last logging resource or Emulate two phase commit in weblogic 11g we found so much slowness in the application.
    Kindly help me in this regard

    Hi,
              Jolt is just a Java client API for Tuxedo services. Typically, Jolt is
              used by a client to invoke a Tuxedo service. From what I could gather
              from your post, you are probably doing some JDBC work and then calling
              out to a Tuxedo service and want the work done with the JDBC/XA driver
              and the database work done by the Tuxedo service to be comitted/aborted
              transactionally? Is this correct?
              If so, then you probably want to look at the JET API (essentially Jolt
              without the need for a JSL/JSH) for invoking Tuxedo services directly
              (instead of through the JSH) from a WLE Java Server. It should be fully
              capable of doing what I have described above.
              Hope this helps,
              Robert
              Hwa Min Tan wrote:
              > I have read that the WLE 5.1 supports the Open XA standard for
              > two-phase (distributed) commits.
              > However, I have been unable to find any documentation / code
              > samples that demonstrates that JOLT is also able to perform
              > two-phase commits, even though its architecture is
              > inherently Tuxedo.
              > We'd like to use two-phase commit on two separate databases
              > (one connected by Jolt and another using the WLE JDBC/XA driver.
              >
              > Does Jolt support two-phase commit and the Open XA standard?
              >
              > Many thanks for your help,
              >
              > Hwa Min
              

  • Bean Managed Transactions and rollback

    Hi Everybody,
    I am using Bean Managed Transactions in a Message Bean which is called every some time by an EJB3 timer. This Message Bean subsequently calls a Session Bean which uses Container Managed Transactions and uses the default transaction attribute which is SUPPORTS. The Session Bean methods might sometime throw a System Exception(inheriting from RuntimeException) which will rollback the Bean Managed Transaction which was started from the Message Bean.
    When this happens and I try to invoke userTransaction.rollback() I get invalid transaction state exception and I suppose this means that is already rolled back.
    Is there a way to get another transaction or set the transaction back to a valid state so I can carry on with some persistence tasks or the only way to do that is by suppressing the RuntimeException and throwing an Application Exception having the *@ApplicationException(rollback=false)* annotation? Can I suppress a System Exception though?
    Thank you in advance!

    Saroj wrote:
    Hi All,
    I would like to know whether we can use JDBC Connection Object's commit and rollback
    methods to control Transaction in Bean Managed Transactions or not.You may use the JDBC connection's transaction support from an EJB. That being said, you
    need to understand that it won't be the transaction that started declaratively by the
    EJB container nor would it be a bean-managed transaction started through
    UserTransaction.
    FWIW, I question why you'd want to do this though. I'd use container-managed
    transactions and let the container handle this for you. The transaction manager
    includes a 1PC optimization so it's not going to do an XA/2PC tx if you only have a
    single resource in the tx. Also, the EJB container includes all the logic to properly
    handle rollbacks when exceptions are thrown etc.
    Finally, your code will more maintainable and reusable if you use the container-managed
    tx + JTA resources. If I later wanted to call another EJB or another JTA resource (eg
    JMS perhaps) I could do it without having to rewrite all of your code.
    -- Rob
    >
    >
    Why is it required that we should use Java Transaction API to control the Transaction
    in Our Beans?
    I understand that if we are using Multiple Resources and need to use Transaction
    then going for JTA makes sense. If I am using only Resource,for example, Only One
    Connection then we should be able to use Connection's Transaction control.
    I understand that other way to do the transaction is to use Container's transaction
    services.
    Please respond at the earliest.
    Thanks in Advance,
    Saroj

  • Bean-Managed Transaction and xDoclet

    Hi,
    i am new by xDoclet.
    Does anybody know, how to specify Bean-Managed Transaction by EJB using xDoclet.
    Thank you very much for any hint or link.
    --Eugen                                                                                                                                                                                                                                                                                                                           

    Thanks Dhiraj for helping,
    I have a application module called TestAppModule. TestAppModule should be deployed as Bean Managed Service Bean. In the Remote of the Application Module, I chose BmtServiceBean. 3 files were created
    RemoteTestAppModule.java
    TestAppModuleHome.java
    TestAppModuleServer.java
    In ejb-jar.xml, this tag was added
    <enterprise-beans>
    <session>
    <description>Session Bean ( Stateful )</description>
    <display-name>TestAppModule</display-name>
    <ejb-name>testBc4jComponents.TestAppModule_bmservice</ejb-name>
    <home>testBc4jComponents.common.serviceejb.beanmanaged.TestAppModuleHome</home>
    <remote>testBc4jComponents.common.serviceejb.beanmanaged.RemoteTestAppModule</remote>
    <ejb-class>testBc4jComponents.server.serviceejb.beanmanaged.TestAppModuleServer</ejb-class>
    <session-type>Stateful</session-type>
    <transaction-type>Bean</transaction-type>
    </session>
    </enterprise-beans>
    In Orion-ejb-jar.xml
    <session-deployment name="testBc4jComponents.TestAppModule_bmservice"/>
    I deployed the bean into oc4j.
    In the Bean Where I am managing the Transaction.
    Context ctx = new InitialContext();
    Object home = ctx.lookup("testBc4jComponents.TestAppModule_bmservice");
    TestAppModuleHome testAppHome = (TestAppModuleHome) PortableRemoteObject.narrow(home, TestAppModuleHome.class);
    When I am looking up the Appmodule Bean, I reached an error stating "Serialization Error, The TestAppModuleImpl is not Serializable"
    Please let me know what I am doing wrong?
    Thanks
    Senthil

  • ADF Service Interface: two-phase commit issue for multiple data sources

    In FusionApps, For a service interface we had to use two DataSource resources (in the ejb-jar.xml),
    one is ApplicationServiceDBDS for SI and the other one is ApplicationDBDS(I don’t know the exact reason why this is needed, but when running the webservice, Framework was throwing an error asking for this) After adding these two, now(while running the webservice) we’re caught up with an error saying that unable to participate in two phase commit. I think this is because we added two dataSources, if we just use one dataSource everything is working fine.
    Error message from app server:
    "JDBC driver does not support XA, hence cannot be a participant in two-phase commit. To force this participation, set the GlobalTransactionsProtocol attribute to LoggingLastResource (recommended) or EmulateTwoPhaseCommit for the Data Source=ApplicationDB"
    we have made the changes to ApplicationDB as said in the error message, but then the server is failing to start because of this.

    Hi,
    this is what the doc says - though not about two phase commit but transaction sharing:
    "At runtime, the calling client and the ADF service may or may not participate in the same transaction, depending on the protocol used to invoke the service (either SOAP or RMI). Only the RMI protocol and a Java Transaction API (JTA) managed transaction support the option to call the service in the same transaction as the calling client."
    When your application accesses a remote ADF Business Components service, each remote call is stateless, and the remote service will not participate in the same transaction as the business component that uses a service-enabled application module's service interface.
    In the majority of the cases, calls to remote services will be informational in nature and will not make changes to remote objects. However, if you must use a remote service to make changes, then keep these points in mind:
    An exception thrown by the remote service will cause the local transaction to fail.
    If you successfully call a remote service that results in modifying data, and then subsequently your local transaction fails for any reason, then it is the responsibility of your error handling code to perform a compensating transaction against the remote service to "undo" the previous change made."
    http://docs.oracle.com/cd/E23943_01/web.1111/b31974/bcextservices.htm
    Frank

  • Configuration of two-phase-commit in OC4J 10.1.2

    Configuration of two-phase-commit in OC4J 10.1.2 in application with multiple modules
    We have an application ear file consisting of ejb-modules (mdb and slsb) and two web-modules. We are using Oracle's advanced queueing for messaging and CMT (all ejb use the Required transaction attribute). We need different datasources (OrionCMTDataSource) including that for aq, so we need two-phase-commit. The web clients use ejbs and browse the messaging system. Our 'orion-application.xml' includes a commit-coordinator configuration, and the database is setup correctly. The configuration works fine for mdbs, when sending messages to the queues. When a client starts after messages have been sent and consumed by the mdbs, oc4j complains that no commit-coordinator is defined in 'server.xml'. If we start the client first, it can access the queues, but then the mdbs complain. It seems that the first one "gets" the commit-coordinator and the second one fails.
    Some questions:
    Why isn't the second client type using the commit-coordinator configuration of the "orion-application.xml"?
    Is such scenario not supported by OC4J?
    How can I setup the application correctly?
    How do I configure commit-coordinator with different datasources to the same database? (Commit-Coordinator is also this database)

    Take a look 'How to Use a Custom Serializer with Oracle Application Server Web Services' [1].
    In your case, you should be looking at BeanMultiRefSerializer (org.apache.soap.encoding.soapenc), which will serialize your data using href and providing a way to deal with cycles.
    All the best,
    Eric
    [1] http://www.oracle.com/technology/tech/webservices/htdocs/samples/serialize/index.html

  • Two Phase Commit on Slow Network

    Can I implement two phase commit transaction using Windows 2000 Professional's Dial-Up Connection ? Where would I find information on this ? I connected two Windows 2000 Prof. PCs using Dial-Up Connection on Telephone line. Now if I try to ping service on other PC using TNSPING it gives me connection timed out, how should I tackle this issue ?

    Hi Ioakim
    Performing an atomic transaction(ACID) that spans a source system, BizTalk and then a different destination system is not possible. This is due to the nature of distributed transactions - it may not be practical to hold locks on resources(needed for atomic
    transactions) that are spread across different networks. Given that there is no guarantee that the resources may be released in a reasonable amount of time, transactions in BizTalk can only be scoped to and from the BizTalk MessageBoxDb. Or in other words,
    you can read a record to BizTalk transactionally and on the send side, send a message from BizTalk transactionally.
    However, you can simulate/fake atomic transaction characteristics(although tricky) using compensation logic within BizTalk orchestrations. So, lets say you read+delete a record from SystemA into BizTalk, and that record has to be updated in SystemB.
    If for some reason the insert to SystemB fails, you would have to write custom logic in a compensation block that then performs the reverse operation in SystemA - i.e., it inserts back the record in SystemA in this case. So, using compensating actions, it
    is possible to ensure that all the systems involved are transactionally consistent at the end of the day.
    There's an article from C.Young that discusses this in some detail-
    http://geekswithblogs.net/cyoung/archive/2006/12/06/100424.aspx
    Thanks
    Arindam

  • Two Phase Commit with WLS6.1 SP2

              Hi,
              I am testing two phase commit using my own resource adapter on WLS 6.1 SP2. And
              I saw something rather strange. The two phase commit process went well at first.
              The first resource manager (RM) was start-ended and then prepare-committed without
              any error. The second RM was also start-ended and then prepare-committed. But
              before the second RM's XAResource.commit() could finish, the first RM's XAResource.commit()
              was called AGAIN, three times, all at the same time, on three different threads,
              with three different XIDs, none of them had ever appeared before, all with onePhase=true.
              Anyone has any similar experience?
              Thanks.
              Yongtao
              

              Hi,
              I am testing two phase commit using my own resource adapter on WLS 6.1 SP2. And
              I saw something rather strange. The two phase commit process went well at first.
              The first resource manager (RM) was start-ended and then prepare-committed without
              any error. The second RM was also start-ended and then prepare-committed. But
              before the second RM's XAResource.commit() could finish, the first RM's XAResource.commit()
              was called AGAIN, three times, all at the same time, on three different threads,
              with three different XIDs, none of them had ever appeared before, all with onePhase=true.
              Anyone has any similar experience?
              Thanks.
              Yongtao
              

  • Bean-managed transaction with EJB 3.0

    Hi,
    I try to get a bean-managed transaction example running with EJB 3.0 under GlassFish v2ur2.
    In order to demarcate the scenario I have to get me the UserTransaction which I get from the SessionContext. I would like to use it then like: UserTransaction ut = context.getUserTransaction();
    I tried to get the SessionContext with the help of the EJB method setSessionContext which should be called by the container after instance creation.
    However, setting a log output into that method does not show any call of this method.
    So, how can I get this method called or is there another way to get the SessionContext for the UserTransaction to work ?
    Are there any good and fully implemented examples for bean-managed transactions ?
    Thanks for your help.
    Regards

    I found the solution for that my SessionContext was NULL and I could not use the UserTransaction.
    The reason for it is that I injected the EJB with @EJB into my servlet and did a MyBean mybean = new MyBean();
    That leads to a SessionContext which is NULL within my EJB.
    If I use it without instantiating it it works fine.
    Again, thanks for your help. At least it pointed me into the right direction.
    Regards

  • How to recover in a two phase commit ?

    I am implementing a two phase commit with Oracle XA in Oracle 8.1.6. I am wondering how I can recover from failures occur between the PREPARE and the COMMIT stage. If I lose the database connection after the changes have been prepared, then I can't find a way to rollback or commit the changes.
    Appreciate any helps.
    Sam

    The iPod OS takes care of where/how to store the files on the iPod and it has not done this. This is why you need to get the files off your iPod first.
    My goal is to connect my iPod to my Mac, launch iTunes, and all of what's on my iPod displays in iTunes after single-clicking the iPod's icon in the Source pane of iTunes' window.
    This is very, very simple. This is how iTunes works normally.
    Since you now have the stuff from your iPod on your computer (using Ollie's iPod Extractor), load them into iTunes.
    Sync them to the iPod. This will update the iPod database so all of the files are seen/identified correctly by the iPod.
    Set the iPod prefs in iTunes to manually update.
    Now you can delete the stuff on your computer and iTunes and view/edit/delete the stuff on the iPod using iTunes.
    The outcome of using the utilities suggested in previous posts is that all of what's on my iPod gets copied to my Mac's hard drive (which is not what I'm trying to accomplish) and then that displays in iTunes' Library.
    Only because the files on the iPod are not "useable" with the iPod or iTunes right now.
    This is not something you will have to do everytime.
    Once you get them on your computer, you can do the above steps and you will not have to use any utilities.
    Just use iTunes.

  • Emulate Two-Phase Commit

    HI,
    <Mar 20, 2009 8:25:32 AM EDT> <Error> <HTTP> <BEA-101017> <[weblogic.servlet.internal.WebAppServletContext@1c1ac17 - appName
    : 'lms-app', name: 'lms', context-path: '/lms'] Root cause of ServletException.
    javax.ejb.EJBException: nested exception is: javax.ejb.TransactionRolledbackLocalException: EJB Exception: ; nested exception is: javax.ejb.EJBException:
    nested exception is: javax.ejb.CreateException:
    nested exception is: java.sql.SQLException: Connection has already been created in this tx context for pool named ejbDS. Illegal attempt to create connection from another pool: liveDS
    I enabled Emulate Two-Phase Commit option for both the datasources ejbDS and liveDs. But still this error is coming in weblogic 9.2.2.
    Can anybody suggest?
    Thanks
    Naveen

    Hi Venki,
    I have encountered the same issue for WebLogic 10.3.Speculating that you have fixed the error for 9.2, could you please provide your inputs on how to fix these kind of issues.
    Thnks
    Pavan

Maybe you are looking for