2014-09-18 1 views
2

나는 자 NHibernate를 사용하여 시스템 일하고, 나는 예외 catch 블록에서 다음 두 줄을 많이 참조 :nhibernate RollbackTransaction 및 롤백 후 세션을 처리하는 이유는 무엇입니까?

session.Flush(); 
session.RollbackTransaction(); 

내가 정말이 논리에 의해 혼란 스러워요, 그것은 변화를 플러시하는 불필요한 작업처럼 보이는을 트랜잭션 롤백 사례를 사용하십시오.

이러한 플러시 호출을 제거하고 RollbackTransaction 메서드에만 의존하기 위해 인수를 설정하려고했지만이 부분은 question에 도달했습니다. 다음으로 나는 링크 된 문서를 더 읽고, 다음 정보를 참조하십시오.

트랜잭션을 롤백하는 경우, 즉시 현재 세션을 닫고 버려서 NHibernate의 내부 상태가 일관성을 유지하는지 확인해야합니다.

이것은 무엇을 의미합니까? 우리는 현재 세션 수명 시간을 웹 요청의 시작과 끝 작업과 짝을 이루기 때문에 롤백을 호출하는 이유는 세션을 유효한 상태로 유지하는 것입니다.

아이디어가 있으십니까?

+1

한 가지는 분명합니다. 롤백하기 전에 플러시를 호출하는 것이 중복됩니다. 코드에서 어디에서나 사용된다는 사실은 사실을 바꾸지 않습니다. 또한 doc-rollback에 설명 된대로 즉시 세션이 끝나야합니다.그래서 우리는 웹에서 글쓰기와 읽기를위한 특별한 요청을해야합니다. 쓰기 작업/요청/작업 단위의 일부가 실패한 경우 - 롤백, 오류 메시지 반환, 세션 종료 ... –

답변

3

NHibernate는 세션을 통한 객체 추적을 수행하고 엔티티를 수행 한 모든 변경 사항이 거기에 저장됩니다. 변경 사항을 저장하면 변경 사항이 db에 기록됩니다. 그렇게하는 동안 예외가 발생하면 세션 상태가 데이터베이스 상태와 일치하지 않으므로이 단계에서 롤백을 수행하면 db 트랜잭션을 롤백하지만 세션 값은 롤백되지 않습니다. 오류 최선을 얻을 경우 그 세션을 어떻게하면 디자인으로 당

는 요청에 따라 세션을 사용하는 경우

을 (도움이되지 않습니다)도 Session.Clear() 신뢰할 수있는 방식으로 추가로 사용되어서는 안된다 접근법은 사용자에게 오류를 표시하고 작업을 다시 시도하도록 요청하는 것입니다. 다른 옵션은 완전히 새로운 세션을 만들고 데이터를 가져 와서 오류를 표시하는 데 사용하는 것입니다.

+0

오류에 관계없이 데이터베이스에 기록해야하는 추가 항목이 있다면 제안해야합니다. 동일한 롤백 로직 내에서 새로운 세션을 만들면됩니까? –

+1

예, 그렇게해야합니다. –

+0

굉장합니다. nhibernate 사용에 대한이 뉘앙스를 명확히하는 데 도움을 주셔서 감사합니다! –

0

Flush보다 Rollback은 롤백 후 세션을 다시 사용하여 발생하는 응용 프로그램의 버그를 해결하기위한 트릭입니다.

혼자서 발견 했으므로 세션을 롤백 한 후에 사용해서는 안됩니다. 응용 프로그램이 귀하의 comment에 따라 실수하고 있습니다. Rollback 전에 Flush없이

세션이 아직 보류로 변경을 고려하고는 Rollback 목적을 물리 치고, 다음 Flush에 커밋됩니다. 롤백 전에 Flush을 실행하면 보류중인 변경 사항이 플러시 된 후 롤백되고 나중에 세션을 플러시하지 않아도됩니다.

하지만 세션이 여전히 일관성있는 상태가 아니므로 세션을 계속 사용하면 응용 프로그램이 위험에 처하게됩니다. 세션 캐시는 시도한 변경 사항을 계속 보유하고 롤백됩니다. 세션은 플러시를 기다리는 보류중인 변경 사항으로 간주하지 않습니다. 세션의 이후 사용 응용 프로그램이 해당 엔티티에 액세스하는 경우 해당 엔티티는 더티로 간주되지 않지만 롤백 된 트랜잭션의 수정 된 상태가 유지됩니다.

관련 문제