2017-10-05 98 views
0

我試着用用MyBatis的映射器Spring的事務管理器像在服務春/ 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(); 
    } 
} 

其中MyMapper由MyBatis的映射的實現如下。 我的實際代碼與此有點不同,但我已將其修改爲類似於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()和D02()應該被回滾,但他們堅持某種原因。我錯過了什麼?這裏是我的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

Spring @Transactional默認回滾未檢查/運行時異常。 的rollbackFor必須只用當你瞄準一個特定的檢查異常/定製一個

在你的情況下刪除該屬性的rollbackFor,默認情況下選中的行爲

+0

不行,它仍然行爲相同 –

+0

@ codemonkey_86531在spring context之外的那兩個操作之間是否存在任何明確的查詢?此外,你正在使用什麼數據庫驅動程序。這僅僅是爲我的信息 – Rizwan

+0

(1)不,不在服務中(2)只是普通的舊mysql JDBC –

0

@Transaction使用 propagation = Propagation.REQUIRED這樣,你就必須努力屬性使用:

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

它將作品。

0

更新:好吧,我現在正在工作。我嘗試了很多不起作用的東西,但是清理解決方案和重新部署可以實現這個技巧(?)。爲什麼會是這種情況,我不知道。