2010-04-19 3 views
4

내가 NHibernate에의 트랜잭션 제어 및 FlushMode 옵션을 사용하여 중첩 된 트랜잭션 행동의 어떤 종류를 달성하기 위해 노력하고있어,하지만 일이 너무 많이 읽은 후 혼란을 조금 가지고 그래서 아래 목록 사실에 대한 확인 것 매우 유용합니다.달성 NHibernate에 중첩 된 트랜잭션 행동

내가 원하는 것은 작은 트랜잭션으로 나누는 하나의 큰 트랜잭션을 여는 것입니다. 다음과 같은 시나리오를 상상해보십시오 :

  • TX1은 TX를 열고 사람 기록을 삽입합니다.
  • TX2는 TX를 열고이 사람의 이름을 P2로 업데이트합니다.
  • TX2 커밋;
  • TX3은 TX를 열고이 사람 이름을 P3으로 업데이트합니다.
  • TX3 롤백;
  • TX1 커밋;

나는 NH가 INSERT와 TX2 UPDATE를 데이터베이스에 보내고, TX3을 무시하고, 그것이 롤백 된 것을보고 싶습니다.

FlushMode = Never를 사용하고 적절한 Begins/Commits/Rollbacks가 요구 된 후에 만 ​​세션을 플러시하려고했지만 NH은 커밋과 롤백과 관계없이 항상 개체의 최종 상태로 데이터베이스를 업데이트합니다. 정상입니까? NH가 FlushMode = Never로 작업 할 때 트랜잭션 제어를 실제로 무시합니까?

또한 FlushMode = Commit 및 중첩 된 트랜잭션 열기를 시도했지만 ADO.NET, 중첩 된 트랜잭션은 실제로 항상 동일한 트랜잭션이므로이를 발견했습니다.

"모든 것이 든 아니든"동작을 얻으려고하지는 않습니다. 나는 세이브 포인트 (savepoint) 방식의 작업 방법을 찾고있다. NH와 함께 (savepoints) 할 방법이 있습니까?

미리 감사드립니다.

Filipe

+0

이 같은 중첩 된 트랜잭션을 사용하는 실제적인 장점은 무엇입니까? – Paco

+1

파코 (Paco), 아이디어는 우리가 transacional 행동과 관련된 "용기"를 가질 수 있다는 것입니다. 이것은 우리가 구축하고있는 통합 프레임 워크이며, transacional 동작이 다른 여러 블록을 가질 수 있습니다. 엔티티 A와 B가 함께 삽입되고 오류로 인해 전체 롤백이 발생하지만 엔티티 C는 계속 통합해야하는 동일한 통합의 세 번째 부분입니다 오류 발생시에도. 시나리오가 조금 복잡하지만이 설명이 귀하가 이해하기를 바랍니다. 나는 보험 회사가 내 이해를 확인하고 이러한 문제를 해결하기위한 다른 방법을 찾아 내려고 노력할 것이라고 기대했다. Tnks. – jfneis

답변

7

그냥 우리가 도입 한 솔루션을 게시합니다, 영원히 개방이 질문에 두지 마십시오합니다.

중첩 된 트랜잭션 동작을 관리하는 container와 같은 작업 단위가 있습니다. 우리가 원하는 치료의 종류에 따라 새로운 세션을 생성합니다 (또는 생성하지 않음). 예를 들어 기준 :

  • 오류에 계속 : 우리는 심지어 다른 사람이 커밋 트랜잭션 오류의 경우 UOW 컨테이너는 각각 "거래"에 대해 서로 다른 세션을 사용하고 그 작품의 마지막에있는 모든 텍사스를 플러시하려면; 오류에
  • 롤백 : 우리는 다른 모든 트랜잭션이 롤백됩니다 (오류로 인해 또는 비즈니스 롤백) 세션 롤백에 그 원하는 경우 UOW 컨테이너는 중첩 된 모든 트랜잭션에 대해 동일한 세션을 사용하여 다시 모두 롤 끝.

이 UoW가 조작하는 "트랜잭션"은 NH (ADO.NET) 트랜잭션이 아니라고 말하는 것이 중요합니다. 우리는 트랜잭션의 추상화를 만들었 기 때문에 트랜잭션이 커밋되거나 롤백 될 경우 조작 코드가 "투표"하지만 선택된 오류 전략에 따라 모든 작업이 끝나면 실제 작업이 수행됩니다.

이 사용법은 매우 일반적인 것이 아니며 특정 시나리오 (여기서는 일괄 처리와의 통합 시나리오)에만 적합하므로 코드를 게시하겠습니다. 누구든지이 구현이 도움이된다고 생각한다면 제게 메시지를 보내주세요. 코드를 공유하게되어 기쁩니다.

감사합니다,

필리페

1

NHibernate는 중첩 트랜잭션을 지원하지 않습니다. 각 세션에는 하나 이상의 활성 트랜잭션이있을 수 있습니다. 나는 당신이 무엇인지 모르겠다. 당신의 시나리오가 나에게 의미가 없기 때문에 성취하려고 노력하고있다. 삽입 후 트랜잭션 1을 커밋하는 것은 동일한 효과를 갖습니다.

+0

Jamie,하지만 비즈니스에 대한 질문을 던지면 TX 1을 롤백 할 수 있습니다. 원하는 모든 동작을 롤백 할 수 있습니다. 위의 내 의견은 Paco에게 상황에 대한 폭 넓은 이해를 제공합니다. 문제를 해결할 다른 방법을 찾으려고합니다. 다른 방법을 찾으면 다시 게시 할 것입니다. – jfneis

+1

아마도 고유 한 트랜잭션을 가질 수있는 자체 작업 단위 (ISession)에서 각 컨테이너를 분리 할 수 ​​있습니다. 잠금 또는 병합을 사용하여 세션을 결합하여 트랜잭션에서 컨테이너를 결합 할 수 있습니다. –

+0

제이미, 그게 내가가는 길이야. 나는 다른 세션을 결합하는 것에 대해 생각하지 못했다. (지금까지는 그럴 필요가 없다.) 그러나 그것은 미래의 어떤 상황에 아마도 맞을 것이다. 어쨌든, 우리는 모든 커밋/롤백을 마지막으로 관리하는 중첩 된 기능을 제공하는 작업 단위에서 각 컨테이너를 분리합니다. 여기를 조금 더 나아간 후 최종 해결책을 게시 할 것입니다. 감사합니다. – jfneis