Castle ActiveRecord에서 트랜잭션을 구현하는 방법을 알고 계십니까?

StackOverflow https://stackoverflow.com/questions/38729

  •  09-06-2019
  •  | 
  •  

문제

나는 다음을 사용하여 클라이언트를 위한 시스템을 만들기로 결정했습니다. 캐슬 액티브레코드, 예를 들어 거래가 작동하지 않는다는 것을 발견할 때까지 모든 것이 잘 진행되었습니다.

               TransactionScope t = new TransactionScope();

               try
               {
                   member.Save();

                   //This is just to see transaction working
                   throw new Exception("Exception");  

                   foreach (qfh.Beneficiary b1 in l)
                   {
                       b1.Create();
                   }


               }
               catch (Exception ex)
               {

                   t.VoteRollBack();
                   MessageBox.Show(ex.Message);
               }
               finally
               {
                   t.Dispose();
               }

하지만 작동하지 않습니다. 트랜잭션 롤백을 시도하기 위해 예외를 던졌습니다. 그런데 놀랍게도 첫 번째 [저장] 레코드가 데이터베이스에 있는 것을 볼 수 있습니다.무슨 일이 일어나고 있나요?

저는 Castle과 NHibernate를 처음 사용합니다. 처음에는 그것이 매우 매력적이라는 것을 알았고 계속해서 그것과 MySQL을 사용하기로 결정했습니다(나는 이 DB를 사용해 본 적이 없습니다). ActiveWriter를 사용해 보았고 매우 유망해 보였지만 오랫동안 노력한 끝에 주에 이 문제를 보고 이제 막힌 것 같고 시간을 낭비한 것 같은 느낌이 듭니다.쉬울 것으로 예상되지만 지금은 이 운동을 수행하는 데 필요한 정보를 충분히 찾을 수 없어서 좌절감을 느끼고 있습니다. 도와주실 수 있나요?

도움이 되었습니까?

해결책

벤이 알아냈어.그 문서는 약간 혼란스럽습니다.마지막 블록을 참조하세요 페이지에서, "중첩 트랜잭션".

다른 팁

다음과 같이 세션 범위에서 코드를 래핑해야 합니다.

using(new SessionScope())
{
   a.Save();
   b.Save();
   c.Save();
}

더 읽어보세요 여기.

마침내 고쳤습니다. 제가 잘못한 일이 발생했습니다. Member 클래스의 Save 메서드를 재정의하고 그 내부와 내부의 sessionScope를 트랜잭션 범위로 만들었으므로 트랜잭션 범위의 모든 항목이 데이터베이스에 저장되었습니다. 그래서 예외를 던졌을 때 모든 것이 이미 저장되어 있었던 것 같아요.

전반적으로 도움을 주셔서 감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top