2013-09-05 10 views
0

@Transactional 주석을 사용하여 트랜잭션 롤백에 문제가 있습니다. 예외가) createOrder (발생, 모든 트랜잭션이 롤백해야하지만이 발생하지 않는 경우봄에 트랜잭션을 롤백하는 방법

public class ItemBackingBean { 
    public void saveUpdate() { 
     try { 
      ItemService.executeTransaction(); 
     } 
     catch(Exception e) { 
     } 
    } 
} 

public class ItemService { 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void executeTransaction() { 
     deleteItem(); 
     createOrder(); 
    } 

    private void deleteItem() { 
     persist(); 
    } 

    private void createOrder() { 
     persist(); 
    } 

    private void persist() { 
     JpaDaoImpl.persist(object); 
     JpaDaoImpl.update(object); 
    } 
} 

public class JpaDaoImpl implements JpaDao { 
    @Transactional(readOnly = true) 
    public persist(Object object) { 
     getEm().persist(object); 
    } 

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 
    public void update(Object object) { 
     getEm().merge(object); 
    } 

    @Transactional(readOnly = true) 
    public void remove(Object object) { 
     getEm().remove(object); 
    } 
} 

:

나는 다음과 같은 backingbean, 서비스, DAO 클래스의 메소드를 가지고있다. 어떤 몸이라도 문제를 말해 줄 수 있습니까?

@Transactional이 JpaDaoImpl.java에 미치는 영향은 무엇입니까? persist() 및 update() 메소드는 서로 다른 radOnly 값을 갖습니다. 이 Dao는 프로젝트의 기존 코드이므로 변경할 필요가 없습니다. 아무도 도와 줄 수 있니?

감사 Bandu

+0

후 구성을 원하는 경우 기존 코드에 영향을주지 않고 PROPAGATION_REQUIRED되는 기본 트랜잭션 전파를 유지하고 트랜잭션을 지원하는 데이터베이스를 사용하고 있는지 확인 할 수 있습니다 MyISAM 테이블은 트랜잭션을 지원하지 않는다.) DAO의'@ Transactional'은 기본적으로 아무 것도하지 않습니다 (설정이 올바른 경우). 서비스의'@ Transactional'이 우선합니다. –

+0

db가 MySQL 인 경우 테이블은 InnoDB 엔진을 사용해야합니다. – vijay

+0

내 데이터베이스는 Oracle입니다. 다른 화면에서 롤백하면 정상적으로 작동합니다. –

답변

0

예외가 createOrder (발생하면), 모든 트랜잭션 롤백되어야하지만 발생하지 않는다. 어떤 몸이라도 문제를 말해 줄 수 있습니까?

롤백 상황들이 RuntimeException 만 발생 (http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html 참조 "Spring 프레임 워크의 트랜잭션 인프라 코드가 기본적으로 만 런타임의 경우 롤백 트랜잭션을 표시합니다 점에 유의하시기 바랍니다, 체크되지 않은 예외;")가 있지만입니다 사용자 정의 행동

당신은과 (MySQL의 당신은 모 아니면도 행동을

관련 문제