2012-09-02 3 views
2

하나의 세션을 유지하고 싶지만 트랜잭션을 롤백하면 isActive = false가되므로 같은 트랜잭션을 사용하여 다음 명령문을 커밋하고 롤백 할 수 없습니다. 그럼 새로운 거래를 만들어야하지만 여기에 무슨 문제가 있습니까?세션에서 올바른 레코드를 제공하지 않습니까?

 var session = NHibernateHelper.OpenSession();/* It returns new session. */ 
     var transaction1 = session.BeginTransaction(); 
     var list1 = session.Query<Make>().ToList(); /* It returs 4 records. */ 
     session.Delete(list1[2]); 

     /* After Rollback, transaction is isActive=false so I can not commit 
     * and rollback from this transaction in future. so I need to create new transaction. 
     */ 
     transaction1.Rollback(); 

     var transaction2 = session.BeginTransaction(); 

     /* It returns 3 records. 
     * I am not getting object(which was deleted but after that rollback) here why ? 
     */ 
     var list2 = session.Query<Make>().ToList(); 

누구나 여기서 어떤 문제가 발생했는지 알 수 있습니까? 롤백 된 삭제 된 개체가 표시되지 않습니다.

+0

귀하의 태그를 편집 한 이유가 있습니다. 귀하의 질문에 전혀 매핑이 없습니다; 왜 당신은 ** ** 매핑 관련 태그를 추가하고 있습니까? –

+1

안녕하세요 디에고, 유창한 nhibernate를 사용하고 있으므로 유창한 nhibernate 태그도 이와 같이 유지하고 싶습니다. –

+0

Fluent NHibernate는 매핑 방법 일뿐입니다. 여기에는 매핑이 없으며 문제는 매핑과 관련이 없습니다. –

답변

0

플러시는 NHibernate가 모든 변경 사항이 DB에 유지되도록합니다. 즉, 필요한 모든 SQL 문이 세션을 DB와 동기화하여 실행되는지 확인합니다. ISession은 ADO.NET 연결의 상태를 메모리에 보유 된 개체의 상태와 동기화하는 데 필요한 SQL 문을 실행합니다.

귀하의 경우 : 트랜잭션이 롤백 인 경우 모든 변경 사항이 되돌려 지지만 세션은 여전히 ​​DB와 동기화되지 않습니다.

그래서 Session.Flush()가이를 수행합니다.

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-endingsession

+0

질문이있는 코드를 확인 했습니까? 확인하고 알려주세요. –

0

알아내는 데 시간이 걸렸지 만 해결 방법은 매우 쉽습니다. transaction1 내에 Flush 없으므로

는 SQL DELETE 자동 SELECT 전에 transaction2 내부 실행되고있다.

이 동작이 예상됩니다.

+1

Diego에게 조사해 주셔서 감사합니다. 예상 결과를 얻기 위해 위의 코드를 어디에 플러시해야하는지 알려주실 수 있습니까? 당신은 정말 많은 문제를 해결하는 데 도움이됩니다. –

+1

롤백 전에 플러시합니다. 하지만 사용 패턴이 정말 이상하다고 말해야합니다. –

+1

예, 그런 코드는 피해야합니다. 최초의 트랜잭션 (transaction) 중에로드 된 객체를 변경해, 플래시 해, 다음에 롤백 (rollback)하는 것을 고려해주세요. 이제 메모리의 객체는 데이터베이스가 원래 상태를 유지하는 동안 수정 된 상태를 표시합니다. 다음 트랜잭션 동안 변경된 상태는 유지되지 않는 상태에도 불구하고 일부 결정의 결과에 영향을 미칠 수 있습니다. 일반적으로 트랜잭션을 중단하는 것은 오류가 발생할 때만 수행되며 세션도 초기화하거나 다시 만들어야합니다. –

관련 문제