Castle ActiveRecord에서 트랜잭션을 구현하는 방법을 알고 계십니까?
-
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를 트랜잭션 범위로 만들었으므로 트랜잭션 범위의 모든 항목이 데이터베이스에 저장되었습니다. 그래서 예외를 던졌을 때 모든 것이 이미 저장되어 있었던 것 같아요.
전반적으로 도움을 주셔서 감사합니다.