2012-01-11 2 views
0

내 응용 프로그램은 2 노드가 있고 지속성 공급자 toplink를 사용하여 MS SQL Server 2005에 연결되는 weblogic 9 클러스터 환경에 배포됩니다. 배포 된 응용 프로그램은 Java로 작성됩니다.weblogic 클러스터 환경에서 작업 할 때 행 잠금이 실패했습니다 (클러스터 안의 여러 노드)

  1. 트랜잭션 그들에
  2. 프로세스들을
  3. 업데이트 테이블 A 잠금 테이블 A와 장소 행에서
  4. 선택 항목 시작 :

    내 응용 프로그램 요청 서빙 할 때 간단한 조작을 할 필요가 그 결과.

  5. 최종 거래

자바 코드는 같다 :

EntityManager em =Persistence.createEntityManagerFactory("NewPersistenceLevelPU").createEntityManager; 
EntityTransaction transaction = em.getTransaction(); 
transaction.begin(); 

// step 2 
em.createNativeQuery("select * from Table_A with(updlock, rowlock) where id = 123"); 
List<List<Object>> results = (List<List<Object>>) query.getResultList(); 

//step 3 
SomeOperation(results); 

// step 4, using the results from step 3 
em.createNativeQuery("update Table_A set Column A = 'something' where id = 123"); 

// step 4 
em.flush(); 
transaction.commit(); 

내가 동시에 노드 1과 노드 2에 요청 A를 실행하는 경우, 두 노드를 진행할 수있을 것으로 보인다 내 예상 밖의 3 단계로. 예상대로 데이터베이스가 노드 (예 : 노드 1)에 의해 잠겨져 있어야하며 (with(updlock, rowlock)) 첫 번째 트랜잭션이 커밋 될 때까지 차단되어야합니다.

내가 잘못했는지 알 수 있습니까? 도움을 주셔서 감사합니다.


답장을 보내 주셔서 감사합니다. 좀 더 조사 후, 나는 다음과 같은 발견

우리의 방법은 사실 그래서 난 지금 궁금

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
<persistence-unit name="NewPersistenceLevelPU" transaction-type="JTA"> 
<provider>oracle.toplink.essentials.PersistenceProvider</provider> 
    <jta-data-source>TestDB</jta-data-source> 
     <properties> 
      <property name="toplink.cache.type.default" value="" /> 
     </properties> 
</persistence-unit> 
</persistence> 

을 다음과 같이 persistence.xml을 인 MDB

  • 에 의해 호출

    1. : 1. 응용 프로그램 관리 또는 컨테이너 관리 트랜잭션 관리자입니까? 2. 두 경우 모두 응용 프로그램 내에서 트랜잭션을 어떻게 처리 할 수 ​​있습니까? UserTransaction 또는 EntityTransaction을 사용합니까? 그것이 비록 통과하기 전에

      많은 감사

  • 답변

    0

    는 모두 3 완료 단계로 얻을 것이다, 두 번째 트랜잭션은 첫 번째 커밋 될 때까지 기다려야합니다.

    이걸 보지 않으면 이상합니다. 123 행이 확실합니까? 그들은 동일한 데이터베이스에 연결되어 있습니까? 트랜잭션이 올바르게 구성 되었습니까? 당신이 (updlock)와 함께하면 그것을 작동합니까? 데이터베이스 구성 방법과 관련이있을 수도 있고 데이터베이스 셸에서 동일하게 시도 할 수도 있습니다.

    select 대신에 행을 업데이트 (일부 열을 자체와 동일하게 설정) 할 수도 있습니다. 이렇게하면 행 잠금을 확보 할 수 있습니다.

    0

    persistence.xml에서 JTA 트랜잭션을 사용하고 있지만 코드에서 JPA EntityManager 트랜잭션을 사용하고 있습니다. 둘 중 하나만 사용할 수도 있고 둘 중 하나만 사용할 수도 있습니다.

    MDB를 사용하는 경우 삽입 된 JTA 관리 EntityManager를 사용해야합니다. JPA 트랜잭션을 사용해서는 안되며 MDB는 자동으로 JTA 트랜잭션을 시작/종료해야합니다.

    WLS에서 JTA 통합을 사용하려면 "toplink.target-server"를 설정하지 않았습니까? TopLink Essentials가 WLS 서버를 제공했는지 모르므로 EclipseLink로 업그레이드 할 수 있습니다.

    JPA EntityManager 트랜잭션을 사용하려면 persistence.xml에서 transaction-type = "RESOURCE_LOCAL"을 설정하십시오.

    +0

    도움을 주셔서 감사합니다. –

    관련 문제