0

현재 작업중인 MVC 3 프로젝트는 현재 세션이 끝날 때마다 삽입/업데이트 호출을 커밋/롤백합니다. 이것은 여러 삽입 작업을 수행하는 경우를 제외하고는 대부분의 경우에 잘 작동합니다.다중 삽입을 막는 NHibernate 세션/트랜잭션

csv가 사이트에 업로드되면 각 레코드가 구문 분석되어 DB에 삽입됩니다. "

don't flush the Session after an exception occurs 

은 어떻게 요청 당 세션을 해제 할 수 있습니다 (또는 내가해야합니까 : 하나 개의 레코드 삽입 실패 할 경우 문제는, 이전의 모든 기록은 롤백 취득하고, 이후의 모든 시도는 오류와 함께 실패 트랜잭션을 다시 시작하십시오)?

편집 : 자세한 사항

요청 물건 당 세션이 IHttpModule을 구현하는 클래스로 구성되어 있습니다. 이 클래스는 HttpApplication 컨텍스트와 UnitOfWork 클래스를 사용합니다. 이것은 커밋과 롤백이 발생하는 곳입니다.

위에서 언급 한 UnitOfWork는 StructureMap을 사용하여 리포지토리에 주입됩니다.

내가 말했듯이,이 동작은 나머지 사이트의 99 %에서 유효합니다.이 대량 업데이트를 통해 세션 당 요청 트랜잭션을 무시하면됩니다. 또는 각각의 새 레코드에 대해 트랜잭션을 수동으로 다시 시작해야합니다. 나는 방법을 모른다.

+0

이 문제가 "자동"아닙니다, 어딘가에 당신이 예외를 캐치해야 다시 세션을 압연. Global.asax를 살펴볼 수 있습니까? –

+0

위의 내용을 추가했습니다. – getit

+0

현재 세션의 인스턴스를 검색 할 수 있습니까? 그렇다면 그것을 사용하여 새 트랜잭션을 생성하고 '사용'하고 업데이트를 수행하십시오. 예외를 HttpModule에 잡히지 않으므로 try/catch로 처리하면 문제가 없습니다. –

답변

0

ISession은 기본값 AutoFlushMode 재산,

자동 ISession

때로는 쿼리가 오래된 상태를 반환하지 않는다는 것을 보장하기 위해 쿼리 실행 전에 플러시가 있습니다. 이것은 기본 비우기 모드입니다. Transaction.Commit()가() 플러시가 명시 적으로 응용 프로그램에 의해 호출하지 않는 한 ISession 플러시 결코 절대로

를 호출 할 때

는 ISession 플러시됩니다을 커밋합니다. 이 모드는 읽기 전용 트랜잭션에 매우 효율적입니다.

지정되지 않음 지정되지 않은 플래시 모드에 대한 특수 값입니다.

항상 모든 쿼리 전에 ISession이 플러시됩니다. 이것은 거의 항상 불필요하고 비효율적입니다.

ISession's FlushMode 속성을 Commit 값으로 변경해보십시오.

0

The session per request stuff is configured in a class that implements IHttpModule.

즉 세션 당 요청 당신이 HttpModule을에서 시작하면, NHibernate에 안무언가이다. 코드를 사용하지 않도록 설정하는 방법은 코드에 따라 다릅니다. 나는 개인적으로 어떤 UnitOfWork 클래스에서 Hibernate를 추상화하는 것을 좋아하지 않는다. 왜냐하면 이제는 사용했던 추상화가 충분하지 않고 더러운 해킹이 아마도 지금가는 유일한 방법이라는 것을 알았 기 때문이다.당신이 실제로 무엇을 하시겠습니까 무엇

(권장하지 않음)입니다 :

foreach (var row in rows) 
{ 
    using (var session = SessionFactory.OpenSession()) 
    using (var tx = session.BeginTransaction()) 
    { 
     var whatever = ... 
     session.Save(whatever); 
     tx.Commit(); 
    } 
} 
관련 문제