|
When we try to begin a transaction and we get an exception while we set suto commit false them the managedConnection is already set that is not null but the transaction is not active yet.
so wat happens next time when u try to begin is , it will through exception saying "Already have an associated managed connection"
below are the flow
the first exception u will get is
s1 Caused by: java.lang.RuntimeException: org.hibernate.TransactionException: JDBC begin transaction failed:
s1 at com.myntra.mysql.ShardEntityManager.getSingleResultWithParams(ShardEntityManager.java:183)
s1 at com.myntra.mysql.ShardDAO.getSingleResultWithParams(ShardDAO.java:104)
s1 at com.myntra.absolut.cart.dao.impl.RawCartShardMysqlDAOImpl.fetchCartById(RawCartShardMysqlDAOImpl.java:84)
s1 ... 43 more
s1 Caused by: org.hibernate.TransactionException: JDBC begin transaction failed:
s1 at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76)
s1 at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
s1 at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)
s1 at sun.reflect.GeneratedMethodAccessor338.invoke(Unknown Source)
s1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
s1 at java.lang.reflect.Method.invoke(Method.java:597) s1 at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
s1 at $Proxy88.beginTransaction(Unknown Source)
s1 at com.myntra.mysql.ShardEntityManager.getSingleResultWithParams(ShardEntityManager.java:157)
s1 ... 45 more
s1 Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
s1
s1 The last packet successfully received from the server was 899 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.
s1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
s1 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
s1 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
s1 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
s1 at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
s1 at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
s1 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567)
s1 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
s1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997)
s1 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
s1 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
s1 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2713)
s1 at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5060)
s1 at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
s1 at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:72)
s1 ... 53 more
s1 Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
s1 at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3017)
s1 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3467)
s1 ... 61 more
and from the on u will get
s1 Caused by: java.lang.RuntimeException: org.hibernate.TransactionException: Already have an associated managed connection
s1 at com.myntra.mysql.ShardEntityManager.getResultListWithParams(ShardEntityManager.java:145)
s1 at com.myntra.mysql.ShardDAO.getResultListWithParams(ShardDAO.java:85)
s1 at com.myntra.absolut.cart.dao.impl.RawCartShardMysqlDAOImpl.fetchCartByLogin(RawCartShardMysqlDAOImpl.java:205)
s1 ... 43 more
s1 Caused by: org.hibernate.TransactionException: Already have an associated managed connection
s1 at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:65)
s1 at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
s1 at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)
s1 at sun.reflect.GeneratedMethodAccessor338.invoke(Unknown Source)
s1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
s1 at java.lang.reflect.Method.invoke(Method.java:597)
s1 at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
s1 at $Proxy88.beginTransaction(Unknown Source)
s1 at com.myntra.mysql.ShardEntityManager.getResultListWithParams(ShardEntityManager.java:125)
s1 ... 45 more
the code that has issue is JdbcTransaction.java
protected void doBegin() { try { if ( managedConnection != null ) { throw new TransactionException( "Already have an associated managed connection" ); }
managedConnection = transactionCoordinator().getJdbcCoordinator().getLogicalConnection().getConnection(); wasInitiallyAutoCommit = managedConnection.getAutoCommit(); LOG.debugv( "initial autocommit status: {0}
", wasInitiallyAutoCommit ); if ( wasInitiallyAutoCommit ) { LOG.debug( "disabling autocommit" ); managedConnection.setAutoCommit( false ); }
} catch( SQLException e ) { throw new TransactionException( "JDBC begin transaction failed: ", e ); // here we need to set managedConnection=null }
isDriver = transactionCoordinator().takeOwnership(); }
|