2016-09-10 6 views
1

DML 문이 롤백되지 않는 이유를 알아 내려고 하루 종일 낭비했습니다. 비록 내가 인터넷 에서뿐만 아니라 stackoverflow에 대한 철저한 검색을 수행했습니다 - 나는 주위에 내 머리를 감쌀 수 없습니다.@ 트랜잭션이 롤백되지 않음

try catch 나 @ExceptionHandler 또는 @ControllerAdvice를 통해 어디에서 예외를 잡으려고하지 않습니다. 내 쿼리가 롤백되지 않는 이유를 파악할 수 없습니다. 이 질문은 중복처럼 들리지만 유래의 다른 게시물 중 어느 것도

spring.xml 내 문제가 해결되지 수

<bean id="employeeImpl" class="org.daoImpl.EmployeeImpl"> 
    <property name="dataSource" ref="dataSource"></property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

컨트롤러

@RequestMapping(value = "/formSubmit", method = RequestMethod.POST) 
public ModelAndView handleForm(@ModelAttribute("employee") Employee employee) { 

    ModelAndView modelAndView = new ModelAndView("Success"); 
    employeeImpl.insertEmployee(employee); 
    return modelAndView; 
} 

그리고 롤백해야 할 마지막 방법

@Transactional(rollbackFor=RuntimeException.class) 
public void insertEmployee(Employee emp) { 
    String SQL = "insert into employee values(?,?,?,?,?)"; 
    getJdbcTemplate().update(SQL, new Object[] { emp.getId(),emp.getFname()); 
    throw new RuntimeException("I am throwing you out!"); 
} 

저는 데이터베이스를 MySQL로 사용하고 있습니다.

런타임 예외가 발생 된 후에도 삽입 쿼리가 데이터베이스에 지속되므로 롤백해야합니다. 누군가 실종 된 부분을 말해 줄 수 있습니까?

+0

RunTimeException을 명시 적으로 지정할 필요는 없습니다. 기본 데이터베이스와 엔진이 무엇인지 궁금하십니까? –

+0

트랜잭션을 지원하지 않는 MyISAM 엔진을 사용하고있을 가능성을 배제하고 싶습니다. –

+0

MyISAM 엔진을 사용합니다. 아마도 작동하지 않는 이유 일 것입니다. InnoDB를 엔진으로 사용하는 테이블을 만들고 다시 시도해 보겠습니다. 고마워. TJ. –

답변

0

테이블의 엔진이 MyISAM이므로 트랜잭션이 롤백되지 않습니다. 이 특정 엔진 은 TJ에서 올바르게 지적한 트랜잭션을 지원하지 않습니다. (필자는 잘 모름)

테이블 엔진을 InnoDB로 변경했으며 트랜잭션이 예상대로 롤백되고 있습니다.

다시 한 번 감사드립니다. TJ!