2011-09-13 4 views
1

내 응용 프로그램 conatians hibernate 및 spring frameworks, tamcat server 및 mysql.봄 콩내 거래

나는 함수에 트랜잭션으로 주석을 달았고, 나는 transacitonal 메서드로 동작하지 않는 것을 보았다. (예를 들어 함수가 끝나기 전에 쿼리 브라우저에서 DB의 변화를 볼 수있다.)

방법은 빈에서 실행,하지만 다른 스레드에서이 같은된다

doDbStuff 내부
executor.submit(new Runnable(){ 

     @Override 
     public void run() { 

      someSpringService.doDbStuff(); 
     } 
    }); 

, 다음과 같이 내가 여러 가지 방법으로 호출하고, 각 방법은 템플릿을 사용하여 :

return getHibernateTemplate().execute(new HibernateCallback(){ 
     public Object doInHibernate(Session session) throws HibernateException, SQLException { 
      return session.createCriteria(MyClass.class).add(Restrictions.eq("id", id)) 
        .uniqueResult(); 
     } 
    }); 

가끔은 또한 내가 HiberateCallback 네이티브 SQL 쿼리 내에서 세션을 사용하여 doInHiberate에 대한 인수로 얻을 exeuctue.

내 질문 - 1. 다른 스레드를 사용하고 있기 때문에 1. 트랜잭션 주석이 무시 되었습니까? 2. 어떻게 트랜잭션 어노테이션으로 주석 처리 된 함수를 스프링 빈으로 (그리고 정규 함수가 아닌 어쩌면 1을 해결할 것인가) 실행할 수 있습니까? 3. 트랜잭션 어노테이션이 포함 된 호출 스택 내에 여러 개의 HibernateCallback을 만들면 트랜잭션 방식으로 동작합니까? 동일한 세션을 사용해야하고 내부 함수간에 전달해야합니까?

덕분에 ...

답변

1

당신이 다르게 작동 않는 스레드 내에서가 아니라 방법을 실행하면 함수가

을 완료하기 전에 내가 쿼리 브라우저에서 DB의 변화를 볼 수 있습니다 ? 내가 다른 스레드를 사용하고 있기 때문

  1. 가 트랜잭션 주석이 무시됩니다 ... MySQL은/​​트랜잭션 격리 문제가 될 수 있는가?

이 경우는 아닙니다. 한 스레드에서 트랜잭션을 작성한 후 새 스레드를 생성하면 후자는 트랜잭션을 "상속하지"않습니다. 귀하의 경우 트랜잭션은 새로운 스레드 내에서 시작되어 올바르게 작동해야합니다.

TransactionSynchronizationManager.isActualTransactionActive() 

가 있는지 확인 :

또한 doDbStuff() 내에서이를 실행 해보십시오.

  1. 내가 스프링 빈으로 트랜잭션 주석 주석이 기능을 실행할 수있는 방법 (아닌 일반 함수로 - 어쩌면 하나를 해결할를)?

무엇을 의미합니까? someSpringService이 Spring에 의해 주입 되었다면 doDbStuff()@Transactional이라는 주석이 달린 공용 메소드입니다. 그냥 작동해야합니다. 그러나 예를 들어, 몇 가지 문제가 있습니다. 비공식 트랜잭션 트랜잭션 메소드를 호출하는 bean 내부에있는 경우 작동하지 않을 수 있습니다.내가 여러 HibernateCallback의 트랜잭션 주석을 포함하는 호출 스택 내에서 만들 경우

  1. 는 - 그것은 트랜잭션 방법으로 행동한다? 동일한 세션을 사용해야하고 내부 함수간에 전달해야합니까?

HibernateCallback가 동일한 JDBC 연결을 다시 사용할 수있을만큼 영리하다 -> 세션을 최대 절전 모드 -> 트랜잭션을.

+0

내가 TransactionSynchronizationManager.isActualTransactionActive()를 확인했는데 생각했던 것처럼 false를 반환했습니다. 문제는 내가 다른 스레드 (트랜잭션 주석 함수의 호출 스택에 스프링 클래스를 포함하지 않음 ...)에서 정규 함수로 Spring Bean을 실행한다고 가정합니다. 일반 콩처럼 funciton을 실행하는 법을 알고 있습니까? – yonatan

+0

BTW - hibrtnateTemplate.beginSession(). startTransaction()을 사용하여 함수의 끝에 커밋 - 여전히 내부 함수는 트랜잭션을 인식하지 못합니다. – yonatan

+0

'someSpringService'를 어떻게 구할 수 있습니까? 같은 스레드에서'executor.submit()'전에'someSpringService.doDbStuff();'를 실행 해보십시오. 그 때 작동합니까? 그렇다면, 두 번째 질문이 있어야합니다. –

0

당신이 당신의 applicationContext.xml에

<tx:annotation-driven/> 

이 있는지 확인합니다.

+0

@erucacn - 가지고 있습니다. – yonatan