1

당신이 수지 + 오라클에 XA 트랜잭션의 문제를 해결하는 데 도움이 시겠어요 실패 오라클 11.2.0.1과 Ehcache 2.7. (실제로 다양한 조합 가능 - Ehcache가있는 /없는 두 가지 Oracle 데이터 소스 (다른 스키마)). 이것은 일반 JDBC 사용에서 JTA 트랜잭션 경계로 전환하는 이유입니다.수지 + 오라클 + [봄] + XA 트랜잭션 REQUIRES_NEW 내부 트랜잭션 커밋은

우리는 다음을 사용합니다 :- Spring 3.2.1로 장식 된 트랜잭션 JTA 구현은 트랜잭션을 단순화하고 트랜잭션 경계 정의에 대한 프로그래밍 방식 접근을 사용합니다 (일시 중단/다시 시작을위한 TransactionManager의 "수동"사용도 문제가 있음) 다음과 같이 "XA"거래 지원으로 구성 캐시와

public void doOuterTransaction() throws Throwable { 
    DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
    def.setName("myTx"); 
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES); 
    TransactionStatus status = txManager.getTransaction(def); 
    Connection connection = null; 
    Cache cache = null; 
    try { 
     cache = ...; // get cache from CacheManager 
     connection = myDataSource.getConnection(); // or "DataSourceUtils.getConnection(myDataSource)" to guarantee same dbConnection from Spring 
     // some business logic 
     doInnerTransaction(); 
     // some business logic 
     txManager.commit(status); 
    } catch (Throwable ex) { 
     txManager.rollback(status); 
     throw ex; 
    } finally { 
     if (connection!=null) { 
      connection.close(); 
     } 
    } 
} 

public void doInnerTransaction() throws Throwable { 
    DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
    def.setName("myTx"); 
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); 
    TransactionStatus status = txManager.getTransaction(def); 
    Connection connection = null; 
    Cache cache = null; 
    try { 
     cache = ...; // get cache from CacheManager 
     connection = myDataSource.getConnection(); // or "DataSourceUtils.getConnection(myDataSource)" to guarantee same dbConnection from Spring 
     // some business logic 
     txManager.commit(status); 
    } catch (Throwable ex) { 
     txManager.rollback(status); 
     throw ex; 
    } finally { 
     if (connection!=null) { 
      connection.close(); 
     } 
    } 
} 
  • 으로 Ehcache. Oracle 드라이버 "oracle.jdbc.xa.client.OracleXADataSource"와
  • 수지 연결 풀, resin.conf 파일을 통해 구성 전파 수준의 영향을받는 자원의 조합과

    <database> 
    <name>my_xa_datasource</name> 
    <jndi-name>jdbc/my_xa</jndi-name> 
    <driver> 
        <type>oracle.jdbc.xa.client.OracleXADataSource</type> 
        <url>${MY_DB_URL}</url> 
        <user>${MY_DB_USERNAME}</user> 
        <password>${MY_DB_PASSWORD}</password> 
    </driver> 
    <max-connections>50</max-connections> 
    <max-idle-time>60s</max-idle-time> 
    <max-active-time>24h</max-active-time> 
    <max-overflow-connections>15</max-overflow-connections> 
    <ping>true</ping> 
    <ping-table>DUAL</ping-table> 
    <ping-interval>240s</ping-interval> 
    <transaction-timeout>24h</transaction-timeout> 
    <xa>true</xa> 
    </database> 
    

모든 거래를 다음과 같이 필수 상자에서 즉시 작동합니다. 그러나 외부 트랜잭션 "REQUIRED"와 내부 트랜잭션 "REQUIRES_NEW"가있는 경우 - 외부 트랜잭션을 일시 중단하면 문제가 발생하고 내부 트랜잭션을 커밋 할 수 없습니다. 그리고 이미 더 많은 것 - 이미 내부 트랜잭션을 실행 중입니다. 완전히 잘못된 것으로 보이는 외부 트랜잭션의 UN 커밋 된 변경 사항을 볼 수 있습니다.

동작은 외부 및 내부 트랜잭션과 관련된 리소스에 따라 다릅니다. 다음과 같은 경우가 있습니다. 1. 내부 트랜잭션과 외부 트랜잭션 모두에서 Ehcache 액세스 만 있으면 내부 트랜잭션에 대해 REQUIRES_NEW를 사용하여 정상적으로 작동합니다. 외부 거래 만 내부 거래에서 DB 접속에

  1. 갖는으로 Ehcache 액세스는 내부 일에 대해서도 REQUIRES_NEW와 함께 잘 작동합니다.

:

  • 외부의 트랜잭션 (transaction) 또는 둘 모두 거래에서 DB 접속이 가능한 케이스 (NO 문제에 관련되어 얼마나 많은 데이터 소스는 데이터 소스 사용이 트랜잭션 경계를 중복하지 않는 경우에도) 내부 거래의 위탁 다음과 같은 오류를 제공

    _

    ch.sc.common.ShortAGRuntimeException: org.springframework.transaction.TransactionSystemException: 
    JTA failure on commit; nested exception is com.caucho.transaction.SystemExceptionWrapper: 
    XA_RMERR: Resource manager error. 
    at ch.sc.glibs.mytest.MyTestServlet.doGet(MyTestServlet.java:34) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:120) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97) 
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at com.caucho.server.security.SecurityFilterChain.doFilter(SecurityFilterChain.java:132) 
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114) 
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156) 
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95) 
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289) 
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838) 
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1309) 
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1265) 
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1249) 
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1157) 
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:956) 
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117) 
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93) 
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169) 
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61) 
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173) 
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118) 
    Caused by: org.springframework.transaction.TransactionSystemException: 
    JTA failure on commit; nested exception is com.caucho.transaction.SystemExceptionWrapper: 
    XA_RMERR: Resource manager error. 
    at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1025) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at ch.sc.glibs.mytest.MyTxTest.test3(MyTxTest.java:155) 
    at ch.sc.glibs.mytest.MyTxTest.doMainComplexTx(MyTxTest.java:81) 
    at ch.sc.glibs.mytest.MyTxTest.doTxTest(MyTxTest.java:50) 
    at ch.sc.glibs.mytest.MyTxTest__ResinScopeProxy.doTxTest(Unknown Source) 
    at ch.sc.glibs.mytest.MyTestServlet.doGet(MyTestServlet.java:32) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:120) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97) 
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at com.caucho.server.security.SecurityFilterChain.doFilter(SecurityFilterChain.java:132) 
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114) 
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156) 
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95) 
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289) 
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838) 
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1309) 
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1265) 
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1249) 
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1157) 
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:956) 
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117) 
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93) 
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169) 
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61) 
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173) 
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118) 
    Caused by: com.caucho.transaction.SystemExceptionWrapper: XA_RMERR: Resource 
    manager error. 
    at com.caucho.transaction.TransactionImpl.heuristicException(TransactionImpl.java:1040) 
    at com.caucho.transaction.TransactionImpl.commitResources(TransactionImpl.java:931) 
    at com.caucho.transaction.TransactionImpl.commit(TransactionImpl.java:886) 
    at com.caucho.transaction.TransactionManagerImpl.commit(TransactionManagerImpl.java:324) 
    at com.caucho.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:363) 
    at com.caucho.transaction.UserTransactionProxy.commit(UserTransactionProxy.java:171) 
    at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1009) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at ch.sc.glibs.mytest.MyTxTest.test3(MyTxTest.java:155) 
    at ch.sc.glibs.mytest.MyTxTest.doMainComplexTx(MyTxTest.java:81) 
    at ch.sc.glibs.mytest.MyTxTest.doTxTest(MyTxTest.java:50) 
    at ch.sc.glibs.mytest.MyTxTest__ResinScopeProxy.doTxTest(Unknown Source) 
    at ch.sc.glibs.mytest.MyTestServlet.doGet(MyTestServlet.java:32) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:120) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97) 
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at com.caucho.server.security.SecurityFilterChain.doFilter(SecurityFilterChain.java:132) 
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114) 
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156) 
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95) 
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289) 
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838) 
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1309) 
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1265) 
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1249) 
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1157) 
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:956) 
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117) 
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93) 
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169) 
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61) 
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173) 
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118) 
    Caused by: oracle.jdbc.xa.OracleXAException 
    at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1110) 
    at oracle.jdbc.xa.client.OracleXAResource.end(OracleXAResource.java:436) 
    at com.caucho.sql.DisjointXAResource.end(DisjointXAResource.java:105) 
    at com.caucho.env.dbpool.ManagedPoolItem.endResource(ManagedPoolItem.java:1017) 
    at com.caucho.env.dbpool.ManagedPoolItem.commit(ManagedPoolItem.java:957) 
    at com.caucho.transaction.TransactionImpl.commitResources(TransactionImpl.java:924) 
    at com.caucho.transaction.TransactionImpl.commit(TransactionImpl.java:886) 
    at com.caucho.transaction.TransactionManagerImpl.commit(TransactionManagerImpl.java:324) 
    at com.caucho.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:363) 
    at com.caucho.transaction.UserTransactionProxy.commit(UserTransactionProxy.java:171) 
    at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1009) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at ch.sc.glibs.mytest.MyTxTest.test3(MyTxTest.java:155) 
    at ch.sc.glibs.mytest.MyTxTest.doMainComplexTx(MyTxTest.java:81) 
    at ch.sc.glibs.mytest.MyTxTest.doTxTest(MyTxTest.java:50) 
    at ch.sc.glibs.mytest.MyTxTest__ResinScopeProxy.doTxTest(Unknown Source) 
    at ch.sc.glibs.mytest.MyTestServlet.doGet(MyTestServlet.java:32) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:120) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:97) 
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at ch.sc.common.http.filters.RegexpFilteringProxyFilter.doFilter(RegexpFilteringProxyFilter.java:65) 
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89) 
    at com.caucho.server.security.SecurityFilterChain.doFilter(SecurityFilterChain.java:132) 
    at com.caucho.server.webapp.WebAppListenerFilterChain.doFilter(WebAppListenerFilterChain.java:114) 
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156) 
    at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95) 
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289) 
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838) 
    at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1309) 
    at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1265) 
    at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1249) 
    at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1157) 
    at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:956) 
    at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117) 
    at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93) 
    at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169) 
    at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61) 
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173) 
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118) 
    

    가 내부적으로 우리가 ORA-25352 "에는 현재의 트랜잭션 (transaction)"가 "사용자 세션이 단계 커밋 준비 중에 거래"에 첨부되지되지 않은 참조 (오라클 JAVA_XA.prepare에 전화를하면 오류 C를 반환 송시). 내부 트랜잭션 커밋 동안 응용 프로그램이 외부 트랜잭션에서 영향을받는 리소스 (DataSource)와 관련이있는 것처럼 보입니다. 내부 트랜잭션에서 데이터베이스 사용이 없기 때문에 Oracle에 대한 호출이 필요하지 않기 때문에 올바르지 않은 것처럼 보입니다.

    최악의 경우 Resin 풀 구현 대신 Apache DBCP 풀을 사용하면 문제가 해결됩니다. Atomikos (TransactionManager 구현과 Connections 풀 구현 모두)의 사용법도 잘 작동합니다. 그러나 위에서 언급 한 두 가지 구현에는 모두 고유 한 문제가 있습니다.

    현재 우리는 DB 풀 또는 XA 드라이버 구성에 문제가 있다고 가정합니다. 문제는 글로벌 대신 로컬 트랜잭션을 사용하는 것과 같은 향상된 기능과 연결될 수 있습니까? 우리는 다양한 자원 정의 (데이터베이스, 자원 참조)를 시도하고, "xa-forbid-same-rm"을 사용하고, 봄 트랜잭션 동기화를 해제하고, 트랜잭션을 일시 중단/다시 시작하기 위해 수동으로 TransactionManager를 사용하려고했습니다.

    모든 아이디어/솔루션을 환영합니다!

  • 답변

    1

    복합 수지/스프링/오라클/XA 트랜잭션이 완벽하게 작동합니다. 여기서 중요한 것은 DB 연결에서 올바르게 작동하는 것입니다.

    거래 내내 모든 DB 연결을 열어야합니다. 이 경우이 자원은 암시 적으로 트랜잭션에 참여하게됩니다. 예제 코드는 그렇게합니다.

    문제는 새로운 트랜잭션을 시작할 때 DB 연결을 OPEN으로 남겨 두었습니다. 이것은 Resin의 DB 풀 (UserConnection이라고도 함)이 제공하는 db 연결이 새 트랜잭션을 시작하기 전에 풀에 반환되지 않았 음을 의미합니다. Resin TransactionManager 구현이 내부 트랜잭션에서 암시 적으로 사용 된 자원 목록에 대한 Unburned db 연결을 추가 한 이유. 그리고 내부 트랜잭션의 커밋은 실패했습니다. 왜냐하면 오라클은 DB 연결이 이미 커밋되지 않은 외부 트랜잭션에서 이미 사용되었다는 것을 알고 있기 때문입니다.

    DB 연결을 안전하게 풀로 반환 할 수 있습니다. resin이 새로운 트랜잭션 내에서 새로운 db 커넥션을 제공하기 때문에 커밋되지 않은 변경 사항이 보이지 않는 내부 트랜잭션 실행 후 외부 트랜잭션에서 db 연결을 다시 요청할 수 있으며이 db 연결은 내부 트랜잭션을 시작하기 전에 정확하게 연결됩니다 , 커밋되지 않은 모든 변경 사항을 볼 수 있습니다. 따라서 레진의 연결에서 풀은 현재 UserTransaction과 관련된 연결을 제공합니다.

    더 중요한 것은 - Spring을 사용하여 데이터 소스 (DataSourceUtils)에서 연결을 얻으려면 DataSourceUtils를 사용하여 내부 트랜잭션을 시작하기 전에 연결을 해제해야 Spring이 연결이 반환되었음을 알 수 있습니다. Spring의 또 다른 장점은 독자적인 TransactionSynchronization 로직을 추가로 가질 수 있다는 것입니다. 데이터 소스를 Spring을 사용하지 않고 직접 사용할 수도 있습니다.이 경우 connection.close()를 호출하여 연결 풀로 반환 할 수 있습니다.

    public void doOuterTransaction() throws Throwable { 
        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
        def.setName("myTx"); 
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES); 
        TransactionStatus status = txManager.getTransaction(def); 
        Connection connection = null; 
        Cache cache = null; 
        try { 
         try { 
          cache = ...; // get cache from CacheManager 
          connection = DataSourceUtils.getConnection(myDataSource); 
          // some business logic 
         } finally { 
          DataSourceUtils.releaseConnection(connection, myDataSource); 
         } 
    
         doInnerTransaction(); 
    
         try { 
          cache = ...; // get cache from CacheManager 
          connection = DataSourceUtils.getConnection(myDataSource); 
          // some other business logic 
         } finally { 
          DataSourceUtils.releaseConnection(connection, myDataSource); 
         } 
        } catch (Throwable ex) { 
         txManager.rollback(status); 
         throw ex; 
        } 
    
        txManager.commit(status); 
    } 
    

    그래서 점점 DB 연결의 방출을 두려워하지 않습니다처럼

    마지막으로 외부 거래 (트랜잭션)의 코드가 보일 것입니다. 연결 풀을 가지고 있습니다 - 빠릅니다. 연결시 close()를 호출하면 풀에만 반환됩니다 (메서드 이름 "release"가 훨씬 좋습니다!). 활성 사용자 트랜잭션이 있으면 commit()을 명시 적으로 호출 할 때까지 변경 사항을 커밋하지 않습니다.

    도움을 주신 모든 분들께 감사드립니다.