2017-10-05 3 views
0

은 내가 MyMapper은 MyBatis로에 의해 매핑 된 서비스봄/MyBatis로 트랜잭션 롤백

@Service("myService") 
class MyServiceImpl implements MyService 
{ 
    @Autowired 
    private MyMapper myMapper; 

    @Transactional(
      value = "transactionManager", 
      propagation = Propagation.REQUIRED, 
      rollbackFor={Exception.class} 
    ) 
    @Override 
    public void doStuff() { 
     myMapper.do1(); 
     myMapper.do2(); 
     throw new RuntimeException(); 
    } 
} 

의 구현에 다음과 같이 MyBatis로 매퍼 Spring의 트랜잭션 관리자를 사용했습니다. 실제 코드는이 코드와 약간 다르지만 코드를 How to use @Transactional annotation in mybatis-spring?과 비슷하게 수정했습니다. 이 서비스는 컨트롤러 클래스에서 다음과 같은 방식으로 사용됩니다. 내가 수집 무엇부터

@Controller 
public class MyController { 
    @Autowired 
    private MyService myService; 

    @GetMapping(value = {"/some/url"}) 
    public String someMethod(){ 
     /* 
     some code 
     */ 

     myService.doStuff(); // this line is not wrapped in try/catch block 

     /* 
     some code 
     */ 

    return "myjsppage"; 
    } 
} 

, DO1의 DB 변경()와 DO2() 롤백해야하지만, 어떤 이유로 유지됩니다. 내가 뭘 놓치고 있니? 여기에 체크되지 않은/런타임 예외에 대한 기본 롤백으로 내 XML을 설정

<mybatis:scan base-package="com.mydomain.mapper" /> 

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

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/mydomain" /> 
    <property name="username" value="uuuuuu" /> 
    <property name="password" value="pppppp" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="typeAliasesPackage" value="com.mydomain.model"/> 
    <property name="configLocation" value="WEB-INF/mybatis-config.xml"/> 
    <property name="mapperLocations" value="classpath*:com/mydomain/mapper/*.xml" /> 
</bean> 

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.mydomain.mapper" /> 
</bean> 

답변

0

봄 @Transactional입니다. rollbackFor 당신이 귀하의 경우에는 하나의

을 사용자 정의 특정 검사 예외를/대상으로 할 때 시도해야 그런 식으로 @Transaction 사용 propagation = Propagation.REQUIRED을 속성 rollbackFor을 제거하고 기본적으로 동작을

+0

아니요, 여전히 동일한 방식으로 동작합니다 –

+0

@ codemonkey_86531 스프링 컨텍스트 외부에서 이러한 두 작업간에 상호 작용하는 명시 적 쿼리가 있습니까? 또한, 어떤 DB 드라이버를 사용하고 있습니다. 이것은 내 정보만을위한 것입니다. – Rizwan

+0

(1) 아니요, 서비스에 없습니다 (2) 평범한 오래된 MySQL JDBC –

0

을 확인에만 사용되어야한다 속성 사용 :

@Transactional(value = "transactionManager", isolation = Isolation.READ_COMMITTED)

그것은 것입니다 작품.

0

업데이트 : 이제 작동하게되었습니다. 나는 작동하지 않는 많은 것들을 시도했지만, 솔루션을 청소하고 배포 할 수 있도록 재구성하는 것이 트릭을 만들었습니다 (?). 왜 그런 경우가 될지 모르겠다.