2014-10-22 2 views
0

Glassfish 4.1 응용 프로그램 서버에서 JTA1.2 @Transactiona l 주석을 테스트 할 때 문제가 있습니다. 나는이 빈의() 메소드를 실행 실행하는 경우 : 내가 예상 오류 얻을@ Transactional rollback transaction

 

@Named 
@RequestScoped 
public class IndexController { 

    @Resource(name = "ds") 
    private DataSource ds; 

    @Transactional 
    public void execute() throws SQLException, SystemException { 
     try (Connection con = ds.getConnection();) { 
      try (PreparedStatement ps = con.prepareStatement(
        "INSERT INTO test(id) VALUES(1)" 
      );) { 
       ps.executeUpdate(); 
       throw new IllegalArgumentException(); 
      } 
     } 
    } 
} 
 

:

Caused by: javax.transaction.RollbackException: Transaction marked for rollback. 

을하지만 SELECT 문을 실행할 때 :

SELECT * FROM test; 

을 내가 그 행이 있었다 참조 삽입. 뭐가 문제 야?

+0

이것을 확인하셨습니까? http://stackoverflow.com/questions/16301315/spring-transactional-and-jdbc-autocommit – Multisync

답변

0

어떤 DB를 사용하고 어떤 모드입니까? 어쩌면 나는 그것을 볼 수 없지만 롤백을 어디에서하고 있습니까? 따라서 엔트리는 롤백 할 때까지 일시적으로 DB에 기록됩니다. 이것을 시도하십시오 :

@Transactional(rollbackOn={Exception.class}) 

정상적으로 catch 블록에서 롤백 메소드를 호출합니다. 트랜잭션은 롤백 된 것으로 표시되기 때문에 롤백 할 책임이 있습니다.

+0

링크와 참조 만 제공하는 대신 답변에 관련 코드를 추가하십시오. 그 질문을하는 사람에게는 훨씬 더 도움이 될 것입니다. – Stewartside