NHibernate를 사용하는 웹 응용 프로그램에서 트랜잭션을 처리 할 수있는 최상의 솔루션을 찾으려고합니다.NHibernate, transactions 및 TransactionScope
우리는 IHttpModule을 사용하고 HttpApplication.BeginRequest에서 새로운 세션을 열고 ManagedWebSessionContext.Bind (context, session)를 사용하여 HttpContext에 바인딩합니다. HttpApplication.EndRequest에서 세션을 닫고 바인딩 해제합니다.
public virtual void Save(T entity)
{
var session = DependencyManager.Resolve<ISession>();
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
}
을하지만 당신은 넣어해야하는 경우 다음이 작동하지 않습니다 : 우리의 저장소 기본 클래스에서
, 우리는 항상 best practice에 따라, 우리의 될 saveOrUpdate 주위에 거래, 삭제 등의 방법을 얻기 포장 예를 들어 어딘가에서 거래 저장, 삭제 등을위한 여러 저장소 호출을 포함하는 응용 프로그램 서비스.그래서 우리는 TransactionScope (내 자신의 transactionmanager를 쓰고 싶지 않았습니다)를 사용하려고했습니다.
저장소 저장() :이 작동하는지 테스트하려면, 내가 .Complete를 호출하지 않는 외부 TransactionScope에()를 사용하여 롤백을 강제로
public virtual void Save(T entity)
{
using (TransactionScope scope = new TransactionScope())
{
var session = DependencyManager.Resolve<ISession>();
session.SaveOrUpdate(entity);
scope.Complete();
}
}
저장소를 사용하는 블록 :
TestEntity testEntity = new TestEntity { Text = "Test1" };
ITestRepository testRepository = DependencyManager.Resolve<ITestRepository>();
testRepository.Save(testEntity);
using (var scope = new TransactionScope())
{
TestEntity entityToChange = testRepository.GetById(testEntity.Id);
entityToChange.Text = "TestChanged";
testRepository.Save(entityToChange);
}
TestEntity entityChanged = testRepository.GetById(testEntity.Id);
Assert.That(entityChanged.Text, Is.EqualTo("Test1"));
이것은 작동하지 않습니다. 하지만 NHibernate가 TransactionScope를 지원한다면 나에게! 어떤 일이 발생하는지는 데이터베이스에 ROLLBACK이 전혀 없지만 testRepository.GetById (testEntity.Id); 명령문이 SET Text = "TestCahgned"가 대신 실행되면 UPDATE가 실행됩니다 (BEGIN TRAN과 ROLLBACK TRAN 사이에서 실행 된 것이어야합니다). NHibernate는 level1 캐시에서 값을 읽고 데이터베이스에 대한 UPDATE를 발생시킨다. 예상 된 동작이 아닙니다!? NHibernate의 범위에서 롤백이 수행 될 때마다 이해하는 것으로부터 현재 세션을 닫고 바인딩 해제해야합니다.
제 질문은 : 누구든지 TransactionScope 및 ManagedWebSessionContext를 사용하여이를 수행하는 좋은 방법을 알고 있습니까?
TransactionScope를 사용하는 경우 NHibernate 2.1을 사용해야합니다. NH가 실제로 TransactionScope와 잘 통합 된 것은 2.1입니다. –