2011-08-03 5 views
3

2 개의 테이블이 있는데 항목 및 속성과 둘 다에 매핑 된 최대 절전 모드 개체가 있습니다. 속성에 대한 테이블 항목에 대한 매핑은 다음과 같습니다.최대 절전 모드 트랜잭션이 올바르게 롤백되지 않습니다.

<set name="propertySet" cascade="all-delete-orphan"> 
    <key column="item_id" not-null="true"/> 
    <one-to-many class="Property"/> 
</set> 

항목은 여러 속성을 가질 수 있습니다. select와 같은 것은 삽입이 제대로 작동합니다. 그러나 오류가 있으면 등록 정보 테이블에 대한 삽입이 롤백되지 않습니다.

N 속성을 가진 항목을 편집하고 필드에 잘못된 값을 입력하면 다음에 항목을 검색 할 때 2 * N 속성이 생깁니다.

편집 ---

내가 던져지고 스프링 프레임 워크와 가장 낮은 제외하고 주석 거래 (@Transactional)를 사용하고

@Autowired 
SessionFactory sessionFactory 

@Transactional 
public void updateItem(Item i){ 
    ... 
    // The only 2 statements dealing with hibernate or session in this function 
    ItemModel im = sessionFactory.getCurrentSession().get(...); 

    sessionFactory.getCurrentSession().update(updatedItem); 
    ... 
} 

처럼 내 수업 보이는 무엇

Caused by: org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.Tra 
nsactionException: Transaction not successfully started 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:679) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 
Caused by: org.hibernate.TransactionException: Transaction not successfully started 
     at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 
    ... 
    ... 
     at org.apache.catalina.valves.SSLValve.invoke(SSLValve.java:113) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
     at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:894) 
     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:719) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2101) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
입니다

답변

2

거래가 "계단식"으로 연결되지 않습니다. 일부 문 java.sql.Connection.commit() 또는 java.sql.Connection.rollback()를 호출

  • 실행 자동 커밋
  • 끄기

    1. : JDBC 레벨에서, 트랜잭션으로 구성되어 있습니다.

    일부 내용이 커밋되고 일부 내용이 롤백되었다고 말하는 경우 트랜잭션 관리에 문제가 있습니다. 자동 커밋이 켜져 있거나 실제로 커밋()이 여러 번 발생합니다. 다음 작업을 수행 할 경우

  • +0

    입니다. 좀 더 명확하게하기 위해 질문이 업데이트되었지만 일부 예외는 있지만 더 많은 디버깅이있었습니다. @Transactional 어노테이션이 이미 나를 대신한다고 가정하기 때문에 더 이상 rollback이나 commit을 요구하지 않는다. – randomThought

    +0

    제대로 구성되어 있으면 @Transactional은 Spring이 적절한 경우 예외를 시작, 커밋 및 롤백하는 곳에서 선언적 트랜잭션 경계를 설정합니다. 세션을 열거 나 트랜잭션을 시작, 커밋 또는 롤백하는 등의 작업을 수행하는 경우 작업이 방해를받습니다. 게시 한 코드에는 잘못된 것은 없지만 작은 코드 일 뿐이며 거래 구성도 포함되지 않습니다. 예외는 비정상 상태가 발생했음을 나타냅니다. 왜냐하면 Spring은 시작되지 않은 트랜잭션을 커밋/롤백하지 않기 때문입니다. –

    +0

    어떤 트랜잭션 구성이 필요합니까? spring은 데이터베이스 연결을 처리하기 위해 백엔드에서 c3p0 연결 풀을 사용하고 있습니다. 자체적으로 트랜잭션이나 세션을 열거 나 시작하는 설명이 없습니다. 최대 절전 모드 또는 세션을 처리하는 함수에는 단 2 개의 명령문 만 있습니다. 내 자신의 세션 및 트랜잭션 물건을 시도했지만 그 문제가 될 수도 있지만 어느 쪽도 작동하지 않았다 – randomThought

    0

    거래는 스프링에 의해 후드 관리 : 귀하의 XML의 설정, 당신은 트랜잭션을 사용하고, 2) 트랜잭션 관리자를 구성) 1이 필요합니다, 다음과 같이

    <tx:annotation-driven /> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
        <property name="sessionFactory" ref="mainSessionFactory" /> 
    </bean> 
    

    송신을 schemaLocation은 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "

    +0

    나는 config에서 이미 simliar를 가지고있다. 그리고 빈 설정은 id = 'txManager'를 제외하고 동일합니다. – randomThought