롤백이 작동하지 않는 것으로 보이는 스프링 트랜잭션 롤백 문제가 있습니다.
@Transactional
주석이 달린 서비스 레이어 메서드 내에서 나는 세 개의 다른 DAOImpl
클래스를 호출하여 3 개의 레코드를 삽입합니다.
중간 삽입은 네 번째 테이블에서 get을 수행하여 설명 필드를 채우지 만 실패합니다. 첫 번째 삽입물이 롤백 될 것으로 예상되지만 실제로 발생하지는 않습니다.
몇 가지 포인트 :스프링 트랜잭션이 롤백되지 않습니다.
- '가져 오기'방법 우리는
applicationContext.xml
에 정의org.springframework.jdbc.datasource.DataSourceTransactionManager
및MySQL datasource
를 사용하는 런타임 예외 - 에게 던졌습니다. 콩이
Beans.xml
에서 만든 우리는 우리는
UPDATE을 봄 3.1을 사용하는 applicationContext.xml
<tx:annotation-driven transaction-manager="transactionManager"/>
을 사용했다 DAO
계층에 ApplicationContext.xml
@Transactional
주석으로 수입되는 : 코드 스 니펫 ....
서비스 클래스 - 이것은 내가 가지고있는 것과 비슷한 것입니다. 나는 @Autowired가 있는지 여부에 관계없이 테스트를 마쳤습니다. 트랜잭션 활성화 메소드는 서비스 클래스 내에서 호출됩니다.
public class CustomerService { //@Autowired CustomerOrderDAO customerOrderDAOImpl; //@Autowired CustomerItemDAO customerItemDAOImpl; //@Autowired CustomerPromotionDAO customerPromotionDAOImpl; //@Autowired PromotionDAO promotionDAOImpl; //other variables public CustomerOrder handleIncomingOrders(CustomerOrder customerOrder) { try { saveOrderDetails(customerOrder); ..... return customerOrder; } catch (Exception e) //TO-DO catch proper exception { //Send error response ....... return customerOrder; } } @Transactional public void saveOrderDetails(CustomerOrder customerOrder) throws Exception { customerOrderDAOImpl.create(customerOrder); .... while (promotionsIterator.hasNext()) { customerPromotion.setPromotionName(promotionDAOImpl.getName(customerOrder.getPromotionId)); customerPromotionDAOImpl.create(customerPromotion); } ...... while (customerItemIterator.hasNext()) { customerItemDAOImpl.create(customerItem); } } }
어떤 생각? 감사합니다. .
서비스 코드를 부르는 방법과 서비스 방법을 보여줄 수 있습니까? 서비스 내에서 또는 외부에서? 또는 당신이 직접 쓴 캐치를 시도합니까? –
트랜잭션 정의에 전파가 설정되어 있습니까 –
'자동 커밋 '모드로 연결되어 있습니까? – kan