You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2019/07/08 11:57:37 UTC

[GitHub] [incubator-shardingsphere] qiaolin-li opened a new issue #2677: TransactionSystemException: Could not commit JDBC transaction; nested exception is java.sql.SQLException

qiaolin-li opened a new issue #2677: TransactionSystemException: Could not commit JDBC transaction; nested exception is java.sql.SQLException
URL: https://github.com/apache/incubator-shardingsphere/issues/2677
 
 
   ### Version
   2.0.3
   
   ### Description
   Transaction commit failed due to Mysql Socket exception
   
   Since I haven't performed a database operation for a long time, the link may be turned off by Mysql
   
   The DruidDataSource discard connection appears when a invalidated link is fetched
   
   But he just prints out this error message, and then he continues to execute the code, but when it commits this transaction, it shows up
   Caused by: org.springframework.transaction.TransactionSystemException: Could not commit JDBC transaction; nested exception is java.sql.SQLException
   
   I wonder if I saved the problematic link and submitted it
   
   Because I see io.shardingjdbc.core.jdbc.adapter.AbstractConnectionAdapter.com at MIT
   The object is submitted in a loop and the exception information is wrapped as an SQLException
   
   ```java
    
       @Override
       public final void commit() throws SQLException {
           Collection<SQLException> exceptions = new LinkedList<>();
           for (Connection each : cachedConnections.values()) {
               try {
                   each.commit();
               } catch (final SQLException ex) {
                   exceptions.add(ex);
               }
           }
           throwSQLExceptionIfNecessary(exceptions);
       }
   ```
   
   So I'm thinking of a couple of questions
   
   1、Why does the link marked with the discard connection not throw the error but continue
   
   2、Why is there an anomaly in submitting things, Is it because the first link to be discarded also exists in the
   io.shardingjdbc.core.jdbc.adapter.AbstractConnectionAdapter#cachedConnections
   So that leads to problems in submitting things...
   
   3、This problem can cause unexpected problems, but only if the link has problems...
   
   ### Java Code
   ```java
           try {
               // Set mandatory routing
               this.setHintManager(context);
   
               Boolean result = transactionTemplate.execute(status -> {
                   try {
                       // The discard connection appears while executing here
                       List<OrderAutoConfirmDeliverySyn> fetchAutoConfirmOrderList = fetchAutoConfirmOrders(context);
                       // It's still going to be updated
                       updateConfirmOrder(context, fetchAutoConfirmOrderList, syncMsgList);
                       return true;
                   } catch (Exception e) {
                       log.error("自动确认收货更新DB异常 ", e);
                       status.setRollbackOnly();
                   }
               });
   
           // Things submitted TransactionSystemException occurs: Could not commit JDBC transaction
           } catch (Exception ex) {
               log.error("自动确认收货异常 ",ex);
           }
       }
   ```
   
   
   ### The stack information 
   
   ```java
   2019-07-06 16:33:52,280 ERROR [autoConfirmThreadPool262-4884] Class=[com.alibaba.druid.pool.DruidDataSource] discard connection
   com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
   
   The last packet successfully received from the server was 1,461,993 milliseconds ago.  The last packet sent successfully to the server was 7 milliseconds ago.
   	at sun.reflect.GeneratedConstructorAccessor137.newInstance(Unknown Source) ~[?:?]
   	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_151]
   	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_151]
   	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3562) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3462) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3903) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4796) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.alibaba.druid.filter.FilterChainImpl.connection_setAutoCommit(FilterChainImpl.java:738) ~[druid-1.1.10.jar!/:1.1.10]
   	at com.alibaba.druid.filter.FilterAdapter.connection_setAutoCommit(FilterAdapter.java:985) ~[druid-1.1.10.jar!/:1.1.10]
   	at com.alibaba.druid.filter.FilterChainImpl.connection_setAutoCommit(FilterChainImpl.java:733) ~[druid-1.1.10.jar!/:1.1.10]
   	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.setAutoCommit(ConnectionProxyImpl.java:430) ~[druid-1.1.10.jar!/:1.1.10]
   	at com.alibaba.druid.pool.DruidPooledConnection.setAutoCommit(DruidPooledConnection.java:712) ~[druid-1.1.10.jar!/:1.1.10]
   	at sun.reflect.GeneratedMethodAccessor111.invoke(Unknown Source) ~[?:?]
   	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
   	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
   	at io.shardingjdbc.core.jdbc.adapter.invocation.JdbcMethodInvocation.invoke(JdbcMethodInvocation.java:48) ~[sharding-jdbc-core-2.0.3.jar!/:?]
   	at io.shardingjdbc.core.jdbc.adapter.WrapperAdapter.replayMethodsInvocation(WrapperAdapter.java:74) ~[sharding-jdbc-core-2.0.3.jar!/:?]
   	at io.shardingjdbc.core.jdbc.core.connection.ShardingConnection.getConnection(ShardingConnection.java:114) ~[sharding-jdbc-core-2.0.3.jar!/:?]
   	at io.shardingjdbc.core.jdbc.core.connection.ShardingConnection.getMetaData(ShardingConnection.java:133) ~[sharding-jdbc-core-2.0.3.jar!/:?]
   	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNextResultSet(DefaultResultSetHandler.java:258) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:197) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[?:?]
   	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
   	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
   	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at com.sun.proxy.$Proxy147.query(Unknown Source) ~[?:?]
   	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:136) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at sun.reflect.GeneratedMethodAccessor104.invoke(Unknown Source) ~[?:?]
   	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
   	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
   	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.2.jar!/:1.3.2]
   	at com.sun.proxy.$Proxy104.selectList(Unknown Source) ~[?:?]
   	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230) ~[mybatis-spring-1.3.2.jar!/:1.3.2]
   	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) ~[mybatis-3.4.6.jar!/:3.4.6]
   	at com.sun.proxy.$Proxy123.findAutoConfirmOrders(Unknown Source) ~[?:?]
   	at sun.reflect.GeneratedMethodAccessor112.invoke(Unknown Source) ~[?:?]
   	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
   	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
   	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197) ~[spring-aop-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at com.sun.proxy.$Proxy124.findAutoConfirmOrders(Unknown Source) ~[?:?]
   	at com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl.fetchAutoConfirmOrders(AutoConfirmDeliveryServiceImpl.java:275) ~[trade-area-core-service-1.0.0.jar!/:1.0.0]
   	at com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl.lambda$handeDelivery$0(AutoConfirmDeliveryServiceImpl.java:175) ~[trade-area-core-service-1.0.0.jar!/:1.0.0]
   	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
   	at com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl.handeDelivery(AutoConfirmDeliveryServiceImpl.java:172) ~[trade-area-core-service-1.0.0.jar!/:1.0.0]
   	at com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl.start(AutoConfirmDeliveryServiceImpl.java:108) ~[trade-area-core-service-1.0.0.jar!/:1.0.0]
   	at com.frxs.trade.area.biz.event.schedule.elasticjob.AutoConfirmDeliveryJob.lambda$execute$2(AutoConfirmDeliveryJob.java:125) ~[trade-area-biz-event-1.0.0.jar!/:1.0.0]
   	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_151]
   	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_151]
   	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_151]
   Caused by: java.net.SocketException: Connection reset
   	at java.net.SocketInputStream.read(SocketInputStream.java:210) ~[?:1.8.0_151]
   	at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_151]
   	at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3011) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3472) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
   	... 62 more
   2019-07-06 16:33:52,441 INFO [autoConfirmThreadPool221-2918] Class=[com.frxs.framework.integration.rocketmq.adapter.RocketMqProducerAdapter] rocketmq
   2019-07-06 16:33:52,485 INFO [autoConfirmThreadPool176-2884] Class=[com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl] 自动确认收货成功 item:4 sharding:101_668804 time:549.9 ms minDate:2019-07-02 00:00:00 maxDate:2019-07-04 23:59:59 limitNum:50 fetchCount:1
   2019-07-06 16:33:52,498 INFO [autoConfirmThreadPool176-2884] Class=[com.frxs.framework.integration.rocketmq.adapter.RocketMqProducerAdapter] rocketmq
   2019-07-06 16:33:52,512 INFO [autoConfirmThreadPool308-4930] Class=[com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl] 自动确认收货成功 item:0 sharding:101_668810 time:580.4 ms minDate:2019-07-02 00:00:00 maxDate:2019-07-04 23:59:59 limitNum:50 fetchCount:1
   2019-07-06 16:33:52,513 INFO [autoConfirmThreadPool183-2880] Class=[com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl] 自动确认收货成功 item:1 sharding:101_668801 time:580.4 ms minDate:2019-07-02 00:00:00 maxDate:2019-07-04 23:59:59 limitNum:50 fetchCount:1
   2019-07-06 16:33:52,522 INFO [autoConfirmThreadPool308-4930] Class=[com.frxs.framework.integration.rocketmq.adapter.RocketMqProducerAdapter] rocketmq
   2019-07-06 16:33:52,523 INFO [inner-job-trade-area-elastic-job.autoConfirmDeliveryJobName-2076-6540] Class=[com.frxs.trade.area.biz.event.schedule.elasticjob.AutoConfirmDeliveryJob] 自动确认收货 任务完成 item:0 time:591.0 ms
   2019-07-06 16:33:52,525 INFO [autoConfirmThreadPool183-2880] Class=[com.frxs.framework.integration.rocketmq.adapter.RocketMqProducerAdapter] rocketmq
   2019-07-06 16:33:52,528 INFO [autoConfirmThreadPool262-4884] Class=[com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl] 自动确认收货成功 item:9 sharding:101_668809 time:587.1 ms minDate:2019-07-02 00:00:00 maxDate:2019-07-04 23:59:59 limitNum:50 fetchCount:1
   2019-07-06 16:33:52,531 ERROR [autoConfirmThreadPool262-4884] Class=[com.frxs.trade.core.service.service.impl.AutoConfirmDeliveryServiceImpl] 自动确认收货异常 item:101_668809 sharding:org.springframework.transaction.TransactionSystemException: Could not commit JDBC transaction; nested exception is java.sql.SQLException 
   
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services