You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Ritika Maheshwari <ri...@gmail.com> on 2007/03/27 00:11:17 UTC

Re: [jira] Commented: (OPENJPA-172) DSRA9250E: Operation setTransactionIsolation is not allowed during a global transaction for Shareable Connections.

Kevin,
           Yes it is JPA that is trying to set the isolation
level.Thishappens when jpa is trying to get the next id from the
sequence , at that
point it tries to get the connection to database and it checks if the
isolation level on the connection is READ_COMMITTED or not. And apparently
the isolationLevel was not read committed therefore it tries to set it
read-committed.I have specified the isolation level in my persistence.xml to
read-committed.Following the code it appears taht AbstractJDBCSeq.next()
finally calls

*protected* RefCountConnection connectInternal() *throws* SQLException {

*return* *new* RefCountConnection(_ds.getConnection());

}
This is in JDBCStoreManager.The _ds.getConnection call will call

*public* Connection decorate(Connection conn)

*throws* SQLException {

// some versions of the DB2 driver seem to default to

// READ_UNCOMMITTED, which will prevent locking from working

// (multiple SELECT ... FOR UPDATE statements are allowed on

// the same instance); if we have not overridden the

// transaction isolation in the configuration, default to

// TRANSACTION_READ_COMMITTED

conn = *super*.decorate(conn);

*if* (conf.getTransactionIsolationConstant() == -1

&& conn.getTransactionIsolation() < conn.*TRANSACTION_READ_COMMITTED*)

conn.setTransactionIsolation(conn.*TRANSACTION_READ_COMMITTED*);

*return* conn;

}

in DB2Dictionary and that is when it fails.This is what I suspect from
looking at the code.It is tough to debug in zos websphere environment.But we
have had previous issues where using zos type 2 driver in gloabal
transaction we were getting errors that cannot setAutoCommit during gloabl
transaction.So this has something to do with running in global
transaction.Because I begin the transaction before I new up the
entityManager.

ritika



On 3/26/07, Kevin Sutter (JIRA) <ji...@apache.org> wrote:
>
>
>    [
> https://issues.apache.org/jira/browse/OPENJPA-172?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12484226]
>
> Kevin Sutter commented on OPENJPA-172:
> --------------------------------------
>
> Ritika,
> The message you referenced...
>
> <0|true|0.9.6-incubating>
> org.apache.openjpa.persistence.PersistenceException: DSRA9250E: Operation
> setTransactionIsolation is not allowed during a global transaction for
> Shareable Connections.
>
> ... is coming from WebSphere.  WebSphere supports the concept of shareable
> connections (per the JCA specification).  Since these connections might be
> shared between applications, WebSphere doesn't want to surprise the user of
> a Shareable connection by allowing modification of properties that could
> affect the operation of that connection.  In this case, somebody (OpenJPA?)
> is attempting to change the TransactionIsolation attribute of a Shareable
> connection while a global transaction is active.  WebSphere prevents this as
> a safety net for our users.  So, it looks like you need to understand why
> the transaction isolation is attempted to be set while the transaction is
> active.  Either we need to hold off on changing the transaction isolation
> until the tran completes, or maybe the setting is superfluous (ie. the
> isolation level is not changing, but the invocation is happening
> regardless).
>
> Hope this helps.
> Kevin
>
> >  DSRA9250E: Operation setTransactionIsolation is not allowed during a
> global transaction for Shareable Connections.
> >
> -------------------------------------------------------------------------------------------------------------------
> >
> >                 Key: OPENJPA-172
> >                 URL: https://issues.apache.org/jira/browse/OPENJPA-172
> >             Project: OpenJPA
> >          Issue Type: Bug
> >          Components: jpa
> >    Affects Versions: 0.9.6
> >         Environment: Websphere 6.1 for zos and DB2 zos V8
> >            Reporter: Ritika Maheshwari
> >             Fix For: 0.9.7
> >
> >
> > My persistence.xml looks like following
> >
> *******************************************************************************************************
> > <?xml version="1.0" ?>
> > <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> >              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >              version="1.0">
> > <persistence-unit name="dwtest" transaction-type="JTA">
> > <provider>org.apache.openjpa.persistence.PersistenceProviderImpl
> </provider>
> >    <non-jta-data-source>jdbc/ErwwDS</non-jta-data-source>
> >        <class>ejb.jpa.test.Customer</class>
> >         <class>ejb.jpa.test.District</class>
> >         <class>ejb.jpa.test.Warehouse</class>
> >         <class>ejb.jpa.test.History</class>
> >        <class>ejb.jpa.test.Item</class>
> >       <class>ejb.jpa.test.Neworders</class>
> >       <class>ejb.jpa.test.Orderline</class>
> >     <class>ejb.jpa.test.Orders</class>
> >       <class>ejb.jpa.test.Stock</class>
> >         <properties>
> >
> >  <property name="openjpa.LockManager" value="pessimistic"/>
> > <property name="openjpa.ReadLockLevel" value="read"/>
> > <property name="openjpa.WriteLockLevel" value="write"/>
> > <property name="openjpa.LockTimeout" value="30000"/>
> >  <property name="openjpa.FetchBatchSize" value="1" />
> >  <property name="openjpa.jdbc.TransactionIsolation"
> value="read-committed" />
> >   <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO,
> Tool=INFO,SQL=TRACE"/>
> >
> >         </properties>
> >     </persistence-unit>
> > </persistence>
> >
> *******************************************************************************************************************
> > The Orderline entity looks like following
> >
> *************************************************************************************************
> > @Entity
> > @IdClass(ejb.jpa.test.OrderlineId.class)
> > @SequenceGenerator(name="mysequence",sequenceName="ORDER_ID")
> > public  class Orderline implements Serializable{
> >
> >       @Id
> >       @GeneratedValue(strategy=GenerationType.SEQUENCE
> ,generator="mysequence")
> >       java.lang.Integer ol_o_id =  null;
> >       @Id
> >       java.lang.String ol_d_id = null;
> >       @Id
> >       java.lang.String ol_w_id = null;
> >       @Id
> >       java.lang.Short ol_number = null;
> >       java.lang.String ol_i_id = null;
> >       java.sql.Timestamp ol_delivery_d = null;
> >       java.lang.String ol_supply_w_id = null;
> >       java.lang.Short ol_quantity = null;
> >       java.math.BigDecimal ol_amount = null;
> >       java.sql.Timestamp itime = null;
> >       java.lang.String ol_dist_info = null;
> >       @ManyToOne(fetch=FetchType.LAZY)
> >       @JoinColumns({
> >               @JoinColumn(name="ol_o_id", referencedColumnName="o_id"),
> >             @JoinColumn(name="ol_d_id", referencedColumnName="o_d_id"),
> >             @JoinColumn(name="ol_w_id", referencedColumnName="o_w_id")
> >    })
> >        Orders orders = null;
> >       @ManyToOne(fetch=FetchType.LAZY)
> >       @JoinColumns({
> >               @JoinColumn(name="ol_i_id",
> referencedColumnName="s_i_id"),
> >             @JoinColumn(name="ol_supply_w_id",
> referencedColumnName="s_w_id")
> >
> >    })
> >        Stock stock = null;
> >
> *************************************************************************************************************************
> > Now if I run the following client
> > UserTransaction ut = null;
> >               ClientEJB  facade = null;
> >               EntityManager em = null;
> >               try {
> >               Hashtable parms = new Hashtable();
> >               parms.put(      Context.INITIAL_CONTEXT_FACTORY,
> >                       "com.ibm.websphere.naming.WsnInitialContextFactory
> ");
> >               InitialContext ctx = new InitialContext(parms);
> >               ut = (UserTransaction) ctx.lookup
> ("java:comp/UserTransaction");
> ut.begin();
> >               em = getFactory().createEntityManager ();
> >
> >                                            try {
> >                       OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
> >                       kem.getFetchPlan().setReadLockMode(
> LockModeType.WRITE);
> >                        stock = (Stock)kem.find(Stock.class,stockKey);
> >                       kem.getFetchPlan().setReadLockMode(null);
> >
> >                       } catch (Exception fe) {}
> >                                            try {
> >
> >                                    Timestamp itime = new Timestamp(
> System.currentTimeMillis());
> >                       Orderline orderLine = new Orderline (districtId,
> warehouseId,
> >                                               new
> Short((short)ol_number), itemId,null, itemSupplyWarehouseId,new
> Short((short)itemQuantity), amount, itime, stockDistInfo);
> >                               em.persist(orderLine);
> >                               em.flush();
> >
> ***************************************************************************************************************
> > I get the the following stack trace, which appears to happen when we try
> to get the next  value from Sequence
> > [3/12/07 13:59:06:496 PDT] 00000020 SystemErr     R
> 3073  TRACE  [WebContainer : 0] openjpa.jdbc.SQL - <t 1503025558, conn
> 1348751460> executing prepstmnt 2134933312 SELECT t0.s_data, t0.s_dist_01,
> t0.s_dist_02, t0.s_dist_03, t0.s_dist_04, t0.s_dist_05, t0.s_dist_06,
> t0.s_dist_07, t0.s_dist_08, t0.s_dist_09, t0.s_dist_10, t0.s_order_cnt,
> t0.s_quantity, t0.s_remote_cnt, t0.s_ytd FROM Stock t0 WHERE t0.s_i_id = ?
> AND t0.s_w_id = ? WITH RS USE AND KEEP UPDATE LOCKS [params=(String)
> 000111, (String) 0001]
> > [3/12/07 13:59:06:498 PDT] 00000020 SystemErr     R
> 3075  TRACE  [WebContainer : 0] openjpa.jdbc.SQL - <t 1503025558, conn
> 1348751460> [2 ms] spent
> > [3/12/07 13:59:06:720 PDT] 00000020 SystemErr     R
> javax.ejb.EJBException: ClientEJB: CreateException: OrderLineLocalHome
> create failed in placeNewOrder() of ClientEJB; nested exception is:
> <0|true|0.9.6-incubating>
> org.apache.openjpa.persistence.PersistenceException: DSRA9250E: Operation
> setTransactionIsolation is not allowed during a global transaction for
> Shareable Connections.
> > <0|true|0.9.6-incubating>
> org.apache.openjpa.persistence.PersistenceException: DSRA9250E: Operation
> setTransactionIsolation is not allowed during a global transaction for
> Shareable Connections.
> >  at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(
> DBDictionary.java:3764)
> >  at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
> SQLExceptions.java:94)
> >  at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
> SQLExceptions.java:80)
> >  at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
> SQLExceptions.java:56)
> >  at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(
> AbstractJDBCSeq.java:59)
> >  at org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java
> :159)
> >  at org.apache.openjpa.util.ImplHelper.generateFieldValue(
> ImplHelper.java:143)
> >  at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(
> JDBCStoreManager.java:554)
> >  at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java
> :435)
> >  at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java
> :420)
> >  at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(
> JDBCStoreManager.java:538)
> >  at org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(
> DelegatingStoreManager.java:131)
> >  at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(
> StateManagerImpl.java:471)
> >  at org.apache.openjpa.kernel.StateManagerImpl.preFlush(
> StateManagerImpl.java:2662)
> >  at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:36)
> >  at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(
> StateManagerImpl.java:845)
> >  at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1865)
> >  at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1825)
> >  at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1609)
> >  at org.apache.openjpa.kernel.DelegatingBroker.flush(
> DelegatingBroker.java:959)
> >  at org.apache.openjpa.persistence.EntityManagerImpl.flush(
> EntityManagerImpl.java:438)
> >  at helpers.ClientEJB.placeNewOrder(Unknown Source)
> >  at erww.web.ErwwController.performServicesForNewOrder(
> ErwwController.java:550)
> >  at erww.web.ErwwController.performTask(ErwwController.java:272)
> >  at erww.web.ErwwController.doGet(ErwwController.java:85)
> >  at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
> >  at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
> >  at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(
> ServletWrapper.java:966)
> >
> > Any idea why is this happening is this a bug.It appears like that while
> trying to get the next value from Sequence JPA tries to get a connection and
> then on the connection if the isolationLevel is not already READ_COMMITTED
> it tries to set it to READ_COMMITTED and that is where it blows out
> > ritika
>
> --
> This message is automatically generated by JIRA.
> -
> You can reply to this email to add a comment to the issue online.
>
>