2011-10-28 2 views
0

끝에 트랜잭션 롤백을 수행하는 통합 테스트가 있습니다. 최근에 테스트에 HQL 명령을 추가했습니다. 그렇게하자마자 HQL 명령으로 트랜잭션이 커밋 된 것처럼 테스트의 다른 많은 쓰기 작업이 데이터베이스에 커밋되기 시작했습니다. 롤백 명령은 결국 호출되며 예외는 발생하지 않지만 데이터는 어쨌든 커밋됩니다. HQL 명령어로 트랜잭션을 커밋 할 수있는 방법이 있습니까?트랜잭션 커밋을 야기하는 HQL 명령

HQL 명령 대신 SQL 명령을 사용하면 오류가 발생하지 않습니다.

환경 : ASP.Net, NHibernate, Oracle.

+0

은 동일한 세션이며 다른 모든 쓰기 작업을 위해 열린 트랜잭션입니까? – Firo

답변

1

당신은 flush와 commit을 혼동하고 있습니다. 플러시는 Hibernate가 SQL 문을 실행하여 데이터베이스의 행을 삽입/갱신/삭제할 때이다. 커밋은 삽입/업데이트/삭제가 영구적으로되어 다른 트랜잭션에서 볼 수있는 경우입니다.

메모리에서 수정되었지만 상태가 데이터베이스에 아직 기록되지 않은 일부 엔티티를 쿼리가 반환해야하기 때문에 HQL 쿼리가 실행될 때 플러시가 수행됩니다. 예를 들어

는 다음 의사 코드

1. select all blue bikes 
2. change them all to red 
3. select all red bikes 

당신은 마지막 쿼리가 방금 빨간색 한 모든 자전거를 반환 할 것이 있다고 가정합니다. 그래서 NHibernate는 마지막 질의를 실행하기 전에 질의가 질의를 찾기 위해 바이크를 데이터베이스로 플러시한다.

+0

나는 네가하는 말을 이해하지 못한다. Hibernate가 데이타베이스로 플러시 (flushing)하면 롤백이 실패하게 되는가? –

+0

아니요. 저는 여러분이 생각하는 것이 커밋이라고 말하는 것은 사실 플러시입니다. HQL 쿼리가 실행되기 전에 SQL 문을 삽입하고 업데이트한다고해서 트랜잭션이 커밋되었음을 의미하지는 않습니다. 그것은 단지 NHibernate가 데이터베이스에 쓰는 것입니다. 마지막에 롤백에 오류가 없다고 스스로 말했습니다. 커밋이 전혀 없습니다. –

+0

롤백에 오류가 없지만 HQL 데이터는 롤백 후에도 DB에 남아 있습니다. 나는 그것을 명확하게하기 위해 나의 질문을 편집 할 것이다. –