2010-08-18 1 views
3

내 웹 응용 프로그램에서 세션 BeginRequest 처리기에서 만들어집니다. 이 세션에 대해 모든 데이터베이스 작업이 수행됩니다. EndRequest 핸들러에서 세션은 커밋 된 트랜잭션을 만드는 데 사용됩니다. 그 후에 세션이 삭제됩니다. 이렇게하면 세션에 대해 수행 된 모든 데이터베이스 작업이 단일 트랜잭션으로 래핑됩니다.NHibernate와 요청 단위 작업 단위 (unit-of-request-request-work-per-request)를 사용할 때 요청 당 여러 트랜잭션을 사용하는 것이 어떤 시나리오에서 유용할까요?

요청 트랜잭션 내에서 커밋 될 트랜잭션을 생성하는 것이 좋은 경우는 언제입니까? 어떻게 이뤄지나요?

즉, 현재 요청에서 수행 된 모든 데이터베이스 작업을 커밋하는 것 이외의 다른 목적으로 트랜잭션을 만드는 이유는 무엇입니까?

답변

1

사용자가 페이지를 방문 할 때 데이터베이스에 다양한 작업 (예 : 페이지 방문 등)을 기록하려고합니다. 이는 동일한 세션에서 행복하게 발생할 수 있지만 페이지 추적이 데이터베이스로 플러시되기를 원합니다. 오류가 발생합니다.

성능면에서 가능한 한 짧은 시간 동안 트랜잭션을 열어 두는 것이 좋습니다. 요청하는 동안 트랜잭션을 열어 둘 이유가없는 데이터베이스 기반이 아닌 많은 작업을 수행하고있을 수 있습니다. 다른 예

많은 ...

0

나는 개인적으로 오류 처리의 단순한 이유로 이런 식으로 일을의 팬이 아니에요. 당신의 트랜잭션. 커밋이 당신의 메인 액션/요청/무엇이든 실패 할 경우, 당신은 무슨 일이 진행되고 있는지에 대한 어떠한 컨텍스트도 가지고 있지 않습니다. 그런 다음 사용자에게 불충분 한 오류 페이지 또는 그와 비슷한 것을 보내도록 남겨 둡니다. 이것은 내부 오류 또는 이와 유사한 것을 나타내는 결과 코드를 반환 할 수있는 웹 서비스를 수행하는 경우 특히 그렇습니다.

나는 일반적으로 호출 당 하나의 비즈니스 트랜잭션이 있으므로, 응용 프로그램 서비스에서 트랜잭션을 관리하고 BeingRequest가 세션을 열고 요청을 처리하여 세션을 플러시하고 처리하도록합니다.

내가 EndRequest에 플러시하는 이유는 트랜잭션 경계 외부에서 발생한 모든 DB 작업을 처리하기 위해서이지만, 모든 사이트/서비스에서이 문제를 처리하는 구성 요소가있는 경우 더 많은 경우입니다.