내 응용 프로그램 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을 만들면 트랜잭션 방식으로 동작합니까? 동일한 세션을 사용해야하고 내부 함수간에 전달해야합니까?
덕분에 ...
내가 TransactionSynchronizationManager.isActualTransactionActive()를 확인했는데 생각했던 것처럼 false를 반환했습니다. 문제는 내가 다른 스레드 (트랜잭션 주석 함수의 호출 스택에 스프링 클래스를 포함하지 않음 ...)에서 정규 함수로 Spring Bean을 실행한다고 가정합니다. 일반 콩처럼 funciton을 실행하는 법을 알고 있습니까? – yonatan
BTW - hibrtnateTemplate.beginSession(). startTransaction()을 사용하여 함수의 끝에 커밋 - 여전히 내부 함수는 트랜잭션을 인식하지 못합니다. – yonatan
'someSpringService'를 어떻게 구할 수 있습니까? 같은 스레드에서'executor.submit()'전에'someSpringService.doDbStuff();'를 실행 해보십시오. 그 때 작동합니까? 그렇다면, 두 번째 질문이 있어야합니다. –