使用JDBC提交事务时出错-全局事务期间不允许操作Connection.commit



当我尝试从本地ejb使用jdbc提交事务时,我收到以下错误connection.commit();Oracle数据库

java.sql.sql异常:DSRA950E:全局事务期间不允许操作Connection.commit。[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.rsadapter.jdb.WSJdbcConnection.commit(WSJdbcConnection.java:941)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.bmo.olbb.mostvisitedcount.exb.MergeAuditRecodsBean.startOperation(MergeAudidRecodsBean.java:89)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.bmo.olbb.mostvisitedcount.exb.MergeAuditRecodsBean.updatePageCountValues(MergeAudidRecodsBean.java:21)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.bmo.olbb.mostvisitedcount.exb.EJSLocal0SLMergeAuditRecodsBean_9da6c3b0.updatePageCountValues[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.bmo.ctp.test.testEJBservlet.doGet(testEJBservlet.java:51)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于javax.servlet.http.HttpServlet.service(HttpServlet.java:743)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于javax.servlet.http.HttpServlet.service(HttpServlet.java:856)[17/11/13 15:33:00:621美国东部时间]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1103)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:570)[17/11/13 15:33:00:621美国东部时间]00000029 SystemErr R,网址:com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrappeer.java:486)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.webapp.webapp.handleRequest(webapp.java:3440)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:267)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.webcontainer.handleRequest(webcontainer.java:815)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1461)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:118)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.http.channe.inbound.inimpl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.http.channe.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.http.channe.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267)[17/11/13 15:33:00:621美国东部时间]00000029 SystemErr R,网址:com.ibm.ws.ssl.cohannel.impl.SSLConnectionLink.definisheNextChannel(SSLConnectionLink.java:1037)[17/11/13 15:33:00:621美国东部时间]00000029 SystemErr R,网址:com.ibm.ws.ssl.channe.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:644)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址:com.ibm.ws.ssl.cohannel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1818)[17/11/13 15:33:00:621美国东部时间]00000029 SystemErr R,网址:com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadComplettionListener.java:165)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncfue.java:217)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFutures.java:161)[17/11/13 15:33:00:621 EST]00000029 com.ibm.io.async.AncFuture.completed(AsyncFuture.java:136)上的SystemErr R[17/11/13 15:33:00:621 EST]00000029 SystemErr R,网址为com.ibm.io.async.ResultHandler.complete(ResultHandler.java:195)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:873)[17/11/13 15:33:00:621 EST]00000029 SystemErr R,位于com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473)

在XA数据源中->WebSphere Application Server数据源属性->WebSphere Application服务器数据源属性>单击非事务性数据源为True。

您的应用程序可能正在使用Container Managed Transaction或其他类型的托管连接。当使用托管事务时,不允许您自己commit(),因为这是由应用程序容器处理的(如果您使用多个数据源,甚至可能使用分布式事务)。

请参阅JavaEE7教程中的容器管理事务:

使用容器管理的事务划分的企业bean不得使用任何干扰容器事务划分边界的事务管理方法。这种方法的例子是java.sql.ConnectioncommitsetAutoCommitrollback方法或javax.jms.Sessioncommitrollback方法。如果需要控制事务划分,则必须使用应用程序管理的事务划分。

如果方法(或方法链)在没有Exception的情况下完成,则会自动执行commit()(除非在上下文上请求显式回滚)。

有一次我遇到了同样的问题。当时我正在使用EJB 1.0,问题发生了,因为我没有在EJB-jar.xml 内的Container Transaction Section中映射EJB方法

  1. 导航到资源>JDBC>JDBC提供程序>JDBC_provider>数据源>数据源>WebSphere Application Server数据源属性

  2. 检查非事务性数据源属性。

最新更新