使用多个实体管理器时,Java事务不起作用

时间:2017-08-25 20:57:15

标签: java postgresql wildfly jta distributed-transactions

我已经工作了几个星期,需要修改一些使用事务的方法,transaccion之间的代码可以通过应用程序在数据库(PostgreSQL)中读取/更新/删除/ etc元素。此时,应用程序正在使用一个peristence单元(指向一个wildfly数据源)和一个实体管理器来访问数据库:

例如:

@PersistenceContext( unitName="name", type = PersistenceContextType.TRANSACTION )
protected EntityManager em;

 public String updateReadRead()
{
    try
    {
        TransactionUtil.begin( this.utx );

        Query nativeQuery = this.em.createNativeQuery("update schema.company_info set service_manager_phone_ext = '1004';");
        int i = nativeQuery.executeUpdate();

        this.searchCriteriaApplication.trimVo();
        this.searchCriteriaCustomer.trimVo();
        this.searchResults = this.applicationSearchService.searchApplications( this.searchCriteriaApplication, this.searchCriteriaCustomer, this.em, false, true );

        this.showAccountsForCustomer = false;

        this.applicationSearchService.searchApplications( this.searchCriteriaApplication, this.searchCriteriaCustomer, this.em, false, true );
        TransactionUtil.commit(this.utx);
    }
    catch ( Exception e )
    {

    }
    return null;
}

但是现在,我们想要使用两个实体管理器,一个负责写操作(指向一个transaccional Data Base),另一个负责读操作(指向副本数据库(ReadOnly DataBase)),例如:

@PersistenceContext( unitName="readonly", type = PersistenceContextType.TRANSACTION )
protected EntityManager readOnlyEM;

@PersistenceContext( unitName="readwrite", type = PersistenceContextType.TRANSACTION )
protected EntityManager readWriteEM;


 public String updateReadRead()
{
    try
    {
        TransactionUtil.begin( this.utx );

        Query nativeQuery = this.readWriteEM.createNativeQuery("update schema.company_info set service_manager_phone_ext = '1004';");
        int i = nativeQuery.executeUpdate();

        this.searchCriteriaApplication.trimVo();
        this.searchCriteriaCustomer.trimVo();
        this.searchResults = this.applicationSearchService.searchApplications( this.searchCriteriaApplication, this.searchCriteriaCustomer, this.readOnlyEM, false, true );

        this.showAccountsForCustomer = false;

        this.applicationSearchService.searchApplications( this.searchCriteriaApplication, this.searchCriteriaCustomer, this.readOnlyEM, false, true );

        TransactionUtil.commit(this.utx);
    }
    catch ( Exception e )
    {

    }
    return null;
}

我尝试了两种方法:

  1. 创建指向只读数据库的新entityManager。当我们使用只读实体管理器然后更改为写入实体管理器时,它会失败,反之亦然(在同一事务中,所有这一切都是这样)。
  2. 如果我们使用两个事务,一个用于读操作,另一个用于写操作,它可以工作。

    (请检查下面的错误堆栈跟踪):

    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
        at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:995)
        at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:920)
        at org.hibernate.internal.SessionImpl.remove(SessionImpl.java:3341)
        at org.jboss.as.jpa.container.AbstractEntityManager.remove(AbstractEntityManager.java:655)
        at com.snap.web.bean.SmartEntityManager.remove(SmartEntityManager.java:68)
        at com.snap.event.EventService.delete(EventService.java:221)
        at com.snap.accountmanager.AccountManagerService.deletePriorityNote(AccountManagerService.java:3877)
        at com.snap.api.AccountManagementResource.deletePriorityNote_aroundBody38(AccountManagementResource.java:1878)
        at com.snap.api.AccountManagementResource$AjcClosure39.run(AccountManagementResource.java:1)
        at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
        at com.snap.common.log.MethodLogger.around(MethodLogger.java:62)
        at com.snap.api.AccountManagementResource.deletePriorityNote(AccountManagementResource.java:1863)
        at com.snap.api.AccountManagementResource$Proxy$_$$_WeldClientProxy.deletePriorityNote(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249)
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:402)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)
        at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
        at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:130)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:162)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:145)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
        at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
        at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
        at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
        at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
        at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
        at 
    
    1. 使用分布式事务。我配置了两个新的XA数据源和两个与这些数据源相关的新的pesistence单元。我更改了entityManagers以指向那些新的持久性单元,但是当它尝试提交时事务失败。我已经在两个数据库中将max_prepared_transactions设置为与maxSession属性相同的值,如文档所示。
    2. 请参阅下面的stacktrace:

      javax.transaction.HeuristicMixedException
          at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1208)
          at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
          at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:89)
          at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:178)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:498)
          at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:433)
          at org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:42)
          at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56)
          at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
          at org.jboss.weldx.transaction.UserTransaction$112420245$Proxy$_$$_Weld$Proxy$.commit(Unknown Source)
          at com.snap.common.utils.TransactionUtil.commit(TransactionUtil.java:71)
          at com.snap.web.bean.application.SearchApplicationTransactionTests.smart_aroundBody4(SearchApplicationTransactionTests.java:339)
          at com.snap.web.bean.application.SearchApplicationTransactionTests$AjcClosure5.run(SearchApplicationTransactionTests.java:1)
          at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
          at com.snap.common.log.MethodLogger.around(MethodLogger.java:62)
          at com.snap.web.bean.application.SearchApplicationTransactionTests.smart(SearchApplicationTransactionTests.java:287)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:498)
          at com.sun.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:181)
          at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
          at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
          at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
          at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
          at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
          at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
          at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
          at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
          at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
          at javax.faces.component.UICommand.broadcast(UICommand.java:315)
          at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
          at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
          at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
          at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
          at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
          at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
          at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
          at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:100)
          at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:130)
          at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:162)
          at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:145)
          at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
          at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
          at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
          at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
          at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
          at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
          at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
          at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
          at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
          at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
          at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
          at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
          at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
          at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
          at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
          at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
          at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
          at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
          at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
          at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
          at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
          at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
          at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
          at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
          at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
          at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
          at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
          at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
          at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
          at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
          at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
          at java.lang.Thread.run(Thread.java:748)
          Suppressed: org.postgresql.xa.PGXAException: Error preparing transaction
                  at org.postgresql.xa.PGXAConnection.prepare(PGXAConnection.java:323)
                  at org.jboss.jca.adapters.jdbc.xa.XAManagedConnection.prepare(XAManagedConnection.java:330)
                  at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelPrepare(XAResourceRecord.java:218)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.doPrepare(BasicAction.java:2662)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.doPrepare(BasicAction.java:2612)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.prepare(BasicAction.java:2155)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1501)
                  at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:96)
                  at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
                  at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)
                  ... 97 more
          Caused by: org.postgresql.util.PSQLException: ERROR: cannot execute PREPARE TRANSACTION during recovery
                  at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
                  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
                  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
                  at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
                  at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
                  at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301)
                  at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287)
                  at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264)
                  at org.postgresql.jdbc.PgStatement.executeUpdate(PgStatement.java:244)
                  at org.postgresql.xa.PGXAConnection.prepare(PGXAConnection.java:315)
                  ... 106 more
          Suppressed: org.postgresql.xa.PGXAException: Error rolling back prepared transaction
                  at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:415)
                  at org.jboss.jca.adapters.jdbc.xa.XAManagedConnection.rollback(XAManagedConnection.java:346)
                  at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelAbort(XAResourceRecord.java:369)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:3017)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:2996)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.phase2Abort(BasicAction.java:1979)
                  at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1517)
                  at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:96)
                  at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
                  at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)
                  ... 97 more
          Caused by: org.postgresql.util.PSQLException: ERROR: cannot execute ROLLBACK PREPARED during recovery
                  at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
                  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
                  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
                  at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
                  at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
                  at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301)
                  at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287)
                  at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264)
                  at org.postgresql.jdbc.PgStatement.executeUpdate(PgStatement.java:244)
                  at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:405)
                  ... 106 more
      

      这些approches中的任何一个都是正确的吗?为了继续测试还是有更好的解决方案来实现这个要求?

      我将不胜感激。

      感谢。

0 个答案:

没有答案