Container-Managed Transaction Type Attributes not working as expected

I am having a problem with the container-managed transactions not working as expected. I have 2 methods that work as follows:
for(a lot)
call MethodB;
@Transaction Type = RequiresNew
EntityManager Persist to database
I want the code in MethodB to be committed to the database when methodB returns. The problem is that I am running out of memory and MethodA is failing. When methodA fails after numerous calls to MethodB nothing is persisted to the database.
It is my understanding that when using requires new transactions that a new transaction is started for each call to the method and ends when the method returns while the calling method transaction is suspended.
How am I misunderstanding the requiresNew transaction attribute. What can I do to make a batch insert into my database that will not run out of memory (commit when a methodB returns)?
Thanks in advance.

The problem is that EJB invocation semantics for security, container-managed transactions, etc.
only apply when an invocation is made through an EJB reference. In your case, you are directly
invoking the implementation method from within the bean. The EJB container has no idea that's
happening. It's no different than invoking a utility method.
In order to get the behavior you'd like, you need to retrieve a reference to your own bean and invoke
through that. You can use SessionContext.getBusinessObject() to get the EJB reference for the
business interface through which the method in question is exposed.

Similar Messages

  • Wls 10.3 weblogic-webservices.xml transaction-timeout attribute not working

    Hi, need some urgent need.
    I have a stateless ejb webservice and I'm trying to set the transaction timeout for some of the methods. Right now my webservice transaction is timing out to the default of 30 secs. I've tried setting in the admin console the JTA transaction timeout option, didn't work (file a case with bea support #81233). And after days of researching and searching I came across that you can setup the weblogic webservice transaction-timeout thru the weblogic-webservices.xml deployment descriptor. Tried setting the transaction-timeout attribute to 120 secs. and that didn't work. Here is the snippet of the xml file.
    <?xml version='1.0' encoding='UTF-8'?>
    <weblogic-webservices xmlns="" xmlns:xsi="" xsi:schemaLocation="">
    Does anybody have any clue to solve my urgent need.
    Thanks in advance for your help or suggestion.

    Unhandled exception
    Type=Segmentation error vmState=0x00040000
    J9Generic_Signal_Number=00000004 Signal_Number=0000000b Error_Value=00000000 Signal_Code=00000033
    Handler1=F144C588 Handler2=F1446A9C
    Target=2_40_20091214_049398 (AIX 5.3)
    CPU=ppc (4 logical CPUs) (0x600000000 RAM)
    ----------- Stack Backtrace -----------
    (0xD696E748 [])
    (0xD8383EDC [])
    (0xD8384514 [])
    (0xD6967718 [])
    (0xD6967158 [])
    (0xD69640D0 [])
    (0xD6932C9C [])
    (0xD69BBA18 [])
    (0xD6932BB8 [])
    (0xD69A77CC [])
    pthreadbody+0x118 (0xD010D784 [libpthreads.a+0x3784])

  • MDB container managed transaction demarcation not working in wls 6.1 beta

    I have an MDB which sends the messages it receives onto another JMS
              destination within the onMessage method. These messages are not sent to
              the JMS destination unless I explicitly use a transacted session for the
              destination and subsequently commit the session. If I set the transacted
              parameter to Session as false the messages are sent. If I set the
              transacted parameter to true the messages will only be output if the
              session is committed. This is the standard behaviour for a JMS session
              but this is not the correct behaviour for an MDB running with
              container-managed transaction demarcation.
              For a start the transacted parameter to session should be ignored when
              run in the context of a container transaction and the commit method
              should thrown an exception as it is not allowed within the context of a
              container transaction.
              This is the MDB code and the deployment descriptor: -
              public class MessageBean implements MessageDrivenBean, MessageListener
              private String topicName = null;
              private TopicConnectionFactory topicConnectionFactory = null;
              private TopicConnection topicConnection = null;
              private TopicSession topicSession = null;
              private Topic topic = null;
              private TopicPublisher topicPublisher = null;
              private TextMessage textMessage=null;
              private transient MessageDrivenContext messageDrivenContext = null;
              private Context jndiContext;
              public final static String
              public final static String
              public MessageBean()
              public void setMessageDrivenContext(MessageDrivenContext
              this.messageDrivenContext = messageDrivenContext;
              public void ejbCreate()
              public void onMessage(Message inMessage)
              jndiContext = new InitialContext();
              topicConnectionFactory =
              topic = (Topic) jndiContext.lookup(TOPIC);
              topicConnection =
              // The transacted parameter should be ignored in the context of a
              container tx
              topicSession = topicConnection.createTopicSession(true,
              topicPublisher = topicSession.createPublisher(topic);
              textMessage = (TextMessage)inMessage;
              // this is illegal in a container transaction
              catch (JMSException je)
              throw new EJBException(je);
              catch (NamingException ne)
              throw new EJBException(ne);
              public void ejbRemove()
              <?xml version="1.0" encoding="UTF-8"?>
              <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise
              JavaBeans 2.0//EN' ''>

    Please see the response in the EJB newsgroup.
              Also, could you kindly only post to a single newsgroup?
              "Jimmy Johns" <[email protected]> wrote in message
              news:[email protected]
              > I have an MDB which sends the messages it receives onto another JMS
              > destination within the onMessage method. These messages are not sent to
              > the JMS destination unless I explicitly use a transacted session for the
              > destination and subsequently commit the session. If I set the transacted
              > parameter to Session as false the messages are sent. If I set the
              > transacted parameter to true the messages will only be output if the
              > session is committed. This is the standard behaviour for a JMS session
              > but this is not the correct behaviour for an MDB running with
              > container-managed transaction demarcation.
              > For a start the transacted parameter to session should be ignored when
              > run in the context of a container transaction and the commit method
              > should thrown an exception as it is not allowed within the context of a
              > container transaction.
              > This is the MDB code and the deployment descriptor: -
              > public class MessageBean implements MessageDrivenBean, MessageListener
              > {
              > private String topicName = null;
              > private TopicConnectionFactory topicConnectionFactory = null;
              > private TopicConnection topicConnection = null;
              > private TopicSession topicSession = null;
              > private Topic topic = null;
              > private TopicPublisher topicPublisher = null;
              > private TextMessage textMessage=null;
              > private transient MessageDrivenContext messageDrivenContext = null;
              > private Context jndiContext;
              > public final static String
              > JMS_FACTORY="weblogic.examples.jms.TopicConnectionFactory";
              > public final static String
              > TOPIC="weblogic.examples.jms.exampleTopic";
              > public MessageBean()
              > {
              > }
              > public void setMessageDrivenContext(MessageDrivenContext
              > messageDrivenContext)
              > {
              > this.messageDrivenContext = messageDrivenContext;
              > }
              > public void ejbCreate()
              > {
              > }
              > public void onMessage(Message inMessage)
              > {
              > try
              > {
              > jndiContext = new InitialContext();
              > topicConnectionFactory =
              > (TopicConnectionFactory)jndiContext.lookup(JMS_FACTORY);
              > topic = (Topic) jndiContext.lookup(TOPIC);
              > topicConnection =
              > topicConnectionFactory.createTopicConnection();
              > topicConnection.start();
              > // The transacted parameter should be ignored in the context of a
              > container tx
              > topicSession = topicConnection.createTopicSession(true,
              > Session.AUTO_ACKNOWLEDGE);
              > topicPublisher = topicSession.createPublisher(topic);
              > textMessage = (TextMessage)inMessage;
              > topicPublisher.publish(inMessage);
              > // this is illegal in a container transaction
              > topicSession.commit();
              > topicConnection.close();
              > }
              > catch (JMSException je)
              > {
              > throw new EJBException(je);
              > }
              > catch (NamingException ne)
              > {
              > throw new EJBException(ne);
              > }
              > }
              > public void ejbRemove()
              > {
              > }
              > }
              > <?xml version="1.0" encoding="UTF-8"?>
              > <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise
              > JavaBeans 2.0//EN' ''>
              > <ejb-jar>
              > <enterprise-beans>
              > <message-driven>
              > <display-name>MessageBean</display-name>
              > <ejb-name>MessageBean</ejb-name>
              > <ejb-class>MessageBean</ejb-class>
              > <transaction-type>Container</transaction-type>
              > <message-driven-destination>
              > <destination-type>javax.jms.Queue</destination-type>
              > </message-driven-destination>
              > <security-identity>
              > <description></description>
              > <run-as>
              > <description></description>
              > <role-name></role-name>
              > </run-as>
              > </security-identity>
              > </message-driven>
              > </enterprise-beans>
              > <assembly-descriptor>
              > <container-transaction>
              > <method>
              > <ejb-name>MessageBean</ejb-name>
              > <method-name>*</method-name>
              > </method>
              > <trans-attribute>Required</trans-attribute>
              > </container-transaction>
              > </assembly-descriptor>
              > </ejb-jar>

  • 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)
              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

    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

  • Error: "Transaction type could not be determined" during PO Creation fromSC

    Hi all,
    I'm working on SRM 5.5 with ECS.
    During the creation of  a PO  I want to add a SC as an item of PO.
    But when I chose the SC and click on the button Add to PO I recive the error:
    Transaction type could not be determined
    In the organizational unit I set the attribute BSA and DP_PROCT_TY.
    there are other steps I have to do to join the transaction type of SC and PO?

    Hi Enzo,
    First check if the attribute BSA and DP_PROC_TY have the same value.
    Then in the attribute value for BSA, change the source system for the document type to your SRM system.
    Create a new PO and a shopping cart.
    Try changing the PO by adding the shopping cart
    Hopefully your problem may get resolved.

  • Container managed transactions in 9.0.3 (plus AQ JMS/MDB)

    Something for "real programmers", similar to MDB Transaction Exception on OC4J 9.0.4 (MDB Transaction Exception on OC4J 9.0.4) but little bit different. Maybe author of the mentioned thread can find some answers here also.
    We have an MDB accessing AQ in database (this works either with 9i and 8i). MDB receives the message (actually TextMessage), retrieves the content/properties and calls some EJBs making database operations. When we used just the same DataSource for JMS resource provider and SQL operations, everything worked OK. But we need to move one step further - making calls to several databases, some 8i, some might 9i. We were able to start CMT for one DataSource, i. e. configuring OrionCMTDataSource over JDBC ORACLE driver (if you use different DataSource class, message remains stucked in queue and eventually expires. If you don't specify container managed transactions for MDB in ejb-jar.xml, it works with any DataSource class - but message is lost every time exception occurs - not very pleasant situation).
    We are trying to configure DataSources so they provide transactional support while using commit coordinator. There are some documents describing this - in 9iAS Data Sources and JTA, Orion Data Sources and possibly JTA description in 9i database documentation. Both ORACLE documents are very similar. Generally, these are main steps:
    1) configure each data source so they provides CMT support (wrap native driver/data source by OrionCMTDataSource class)
    2) create datasource commit-coordinator database, also using CMT(?)
    3) create user in commit-coordinator database and same in each other database with connect, resource, create session + force any transaction priviledge (since it would commit other users transactions)
    4) create database links from commit-coordinator database to each databases (but... see questions below)
    5) configure commit coordinator so it uses proper data source
    6) add each DB link as a property to data sources
    7) configure data source for JMS
    8) connect JMS resource provider with JMS data source
    9) Start container, send message, etc.
    So far the only result we've got is a trace file in database user dumps and generic "javax.transaction.SystemExeption: Could not commit: error code 29540". User dump occurs in a "remote" database, not the one where commit coordinator resides. If I drop database links, result is the same, so it seems like problem with data source itself. In a dump there is piece of text like this: "FATAL ERROR IN TWO-TASK SERVER: error = 12571" and "ksedmp: internal or fatal error
    Current SQL statement for this session:
    begin$_dequeue_in( :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24, :25, :26, :27, :28, :29); end; ". I think AQ call is just a coincidence since it is the first one involved in transactions. Down there in HEX part of a dump there is a message about protocol or network error ("probably ORA-28546")
    Here is an example of data source configuration we are using:
    <!-- Passport CMT DataSource -->
    <property name="dblink" value="ICON.WS18885.APPG.COM"/>
    There are some questions pending. Obvious one is if CMT is working or not at all and we should find some different solution (Bean managed transactions or use XA, hmmm). Other one might be that database link has to be "fully-qualified". I'm not sure what it means: using username and password? Using database name along with domain (if any)? So far it seems links are not used anyway.
    We've tried several databases, like and 9.0.3 versions. Result is the same.
    We've tried to use XA data source of ORACLE (oracle.jdbc.xa.client.OracleXADataSource) and OrionCMT data source bound by xa-source-location to it but container gets stucked upon restart with "Investingating resource 'XADataSource PassportXADS' for recovery..." and similar messages for an hour.
    There is an OracleJTADataSource mentioned in several documents, but I cannot find any in jdbc classes - was it deprecated?
    Lies the problem in JMS itself? So far we've been able to use AQ in 8i and 9i and succesfully commit every transaction - provided transaction was local.
    Since XA itself is working I guess problem might be with configuration.
    I will appreciate any opinion on CMT... also, if you have any questions, please ask.

    Hi Per,
    I don't have an answer for you -- sorry {:-( -- only a suggestion (which
    you may have already tried, anyway :-). Have you tried running OC4J
    in "debug" mode? The following web-page gives details on how to do that:
    Also, if you aren't already aware of them, the following web-sites
    may also be helpful (not in any particular order):
    Good Luck,

  • JTA Container Managed Transaction Demarcation question?

    Hello, there is something I'm not quite sure about, concerning JTA Container managed transaction
    I have a remote stateful session bean with a method f().
    the method f() calls the methods g() and h() residing in a different stateless local bean DBLocalBean.
    (DBLocalBean only deals with database calls using the EntityManager)
    I would like to know where the commit is being executed? after f() or after g() and h()

    Hi Meir,
    It depends on the exact settings of the container managed transaction attributes. The most typical (and default) transaction attribute is TX_REQUIRED. TX_REQUIRED means that when a business method invocation arrives the container will either a) import any existing propagated client transaction context or b) if one is not available, start a new transaction.
    Assuming TX_REQUIRED for the three business methods in your example, the container would start a new transaction before invoking f() . Both g() and h() would execute in that same transaction since f's transaction would propagate to them. Finally, after f() returns, the container would commit the transaction it started.

  • Container Managed Transactions

    Hi everyone
    I've been reading some documentation about Container Managed Transactions and I am not sure if I understood the actual meaning of the "required" attribute.
    Imagine one user calls a method (whith "required") wich joins a transaction. If another user calls the same method at the same the transaction is running, that means this method joins the same transaction of the other user? Or this only happen if the first user calls another "required" method?

    If another user calls the
    same method at the same the transaction is running,
    that means this method joins the same transaction of
    the other user? Or this only happen if the first user
    calls another "required" method?
    Not sure what you mean. First a txn of one user is isolated from the txn of another (remember the ACID props of txns). So a given txn spawn by one user can never be 'joined' by another.
    What 'required' means is that, for one given user, if a txn is in progress already from a method (method 1) when another method (method2) is called, method2 joins the txn in method1; if there were no txn in method1, a new txn is started in method2.

  • Can i user UserTransaction  in a Container-managed transaction Bean

    can i use UserTransaction to control transaction boundaries in a container-managed transaction bean method?
    below is the method:
    there is one-to-many between Employees and SalaryItem
    @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
    private void initEmployeesSalary(Long salarySumId) {
    for(Employees employees: liEmployees){
    for (int i = 0; i < 20; i++) {                                                           
    SalaryItem item = new SalaryDetailItem();
    when there are about 1000 employees,the method run very slow.
    What do you think I should do?

    Hi again,
    The EJB specs say that a stateful Session Bean with CMT is NOT allowed to use the UserTransaction; see page 361 of the EJB2.0 specification. So combining them will not (or should not) work.
    I suggest CMT+SessionSynchronization combined with using a flag to indicate whether notify should be called or not. Otherwise, you could try splitting up the bean into two beans: one with CMT and another one without. The one without CMT could use the UserTransaction and notify.
    Also, you might want to check
    Hope that helps a bit,

  • Executing SQL statements in container managed transactions

    I have a problem when using TopLink 9.0.3 with WebSphere 4, Oracle 9i and J2EE container managed transactions.
    The data changing SQL statements are executed at the end of the (container managed) transaction, not at the time of the calls to UnitOfWork.registerNewObjekt(),
    UnitOfWork.validate...() or UnitOfWork.commit...().
    UnitOfWork(2035008996)--validate object space.
    UnitOfWork(2035008996)--validate cache.
    UnitOfWork(2035008996)--Connection(398132708)--INSERT INTO SVM_PERSONEN (FAX, NAME, ID, [...]) VALUES ([...])
    UnitOfWork(2035008996)--release unit of work
    But the end of the transaction is out of the application server code. The transaction ends after the invoke of the applixcation server method, as the stack trace of an occurring exception shows:
    remote exception
    javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 0 No; nested exception is:
    So the application server code has no possiblity for special reaction to this error condition.
    How can I use TopLink to execute my SQL statement immidately, not at the the end of the transaction (which is out of the area of my code)? Only the transaction should end at the usual time, managed by the container.

    I don't think there is anyway to currently do this in a JTS managed environment, to handle the exceptions you could,
    - Make use of TopLink session ExceptionHandlers to handle the database errors during the JTS commit.
    - Let TopLink control the transactions instead of JTS.

  • MDB Container Managed Transaction and Log4J

    I'm programming and MDB that reads and updates a database then sends out an HTTP Post and logs using log4j. I've read that when an MDB is configured as CMT or container managed transaction and the OnMessage method executes without errors, the transaction is implicitly commited. You can rollback the transaction by explicitly calling setRollbackOnly() or when a RuntimeException has been thrown. My worry is that after I have sent out an HTTP POST (a transaction has been completed) I would have to log a transaction completion using log4j. My problems is if log4j throws a RuntimeException thereby rolling back my transaction which shouldn't be the case. What I have done is to catch all Exceptions (and swallow them) whenever I log using log4j after I have sent out an HTTP POST succesfully (since my transaction should be complete by then). Is this a correct workaround?
    Thanks :)

    Your approach is correct. If you think, Log4J might throw errors, swallow the exceptions and try not to roll back.

  • AA390 Transaction type 345 not possibel to post to affiliate company

    We are getting this error AA390 transaction type 345 not possible to post to affiliate company , while settling an AuC to a fixed asset using trx AIAB.
    Please advise how this can be resolved or any config steps are missing for TTypes 345 or 346.

    Check in transaction type 345/346, Radio Button for Post to Affiliate Company is selected. In case its not, please select the radio button and then try again.This should work.
    By default, Post not to affiliated company is selected.
    Hope this helps.

  • Entity Bean can only use container-managed transaction demarcation?

    In <<Designing Enterprise Application with J2EE 2nd>>
    Section Enterprise Bean Transactions,it says:Entity beans can only use container-managed transaction demarcation.
    That means,i can not get UserTransaction from EJBContext.
    Is that true?

    Yes this is the requirement of the specs. Your ejb code generator should give you the error if you use usertransaction.

  • Transaction type does not exist. Check entries

    Hello all,
    EBP 5.0, CCM 1.0, unicode
    When I try to log on different language than English and try to shop system is displaying two messages
    Internal number range is missing for transaction type. Inform syst. admin
    Transaction type does not exist. Check entries
    And I cannot see link for Procurement Catalog.
    All my customizing up to now was in English, due to the fact that SAP did not provide translation to Croatian (Latin-2 language).
    Also catalog call-up has locale "en" for the calling of catalog from EBP.
    Please give hint where I can start with debugging.

    Hello Yann,
    main problem, language files for CCM and EBP are not suppied from SAP yet. MY BC told me that they installed Croatian language in WAS, so system should behave as language is intalled fully and represent text in English when there is no translation.
    I cannot test other things because EBP will not go into the catalog due to the missing internal numbering for the transaction type. I checked BUS2121 in transaction types but nothing to be found.
    I was thinking that those two problems are related but this is not true. First I have to solve number range that check the catalog. Only common between those two problems is logon language.
    I even forced our special characters by entering them as UNICODE code and I can see them via catalog manager in english, but only for catalog items. Characteristics and product category names do not follow UNICODE specification.

  • Definition VendorSiteCode of type Attribute not found in InvoiceheaderVO_InvoiceInstallment_InvoiceHeaderVOToInvoiceInstallmentVO_InvoiceInstallmentVO

    Hi All,
    We had deployed Fusion Payables applications locally and tried creating invoice on invoice work bench.
    After selecting BU, getting error saying 'an error occurred Domain: AP_domain, Server instance: AdminServer, application: PayablesApp
    After clicking ok for error, selected supplier and received same error and clicked OK and proceeded to select vendor site.
    When clicked on Supplier site, getting error saying "oracle.jbo.NoDefException: JBO-25058:Definition VendorSiteCode of type Attribute not found in InvoiceheaderVO_InvoiceInstallment_InvoiceHeaderVOToInvoiceInstallmentVO_InvoiceInstallmentVO"
    I had verified vendor_site_code available in POZ_Supplier_sites_v table and tried refreshing view, redeployed view multiple times but still issue persists.
    Please help in this regard.

    as your error say - oracle.jbo.NoDefException: JBO-25058:Definition VendorSiteCode of type Attribute
    VendorSiteCode is not found in VO definition.check you page definition file and VO.

Maybe you are looking for