Spring / MyBatis事​​务回滚

时间:2017-10-05 16:35:12

标签: java spring spring-mvc 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()和do2()中对DB的更改,但由于某种原因它们仍然存在。我错过了什么?这是我的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>

4 个答案:

答案 0 :(得分:0)

Spring @Transactional默认情况下回退unchecked / runtime异常。 仅当您定位特定的已检查异常/自定义异常

时,才必须使用属性rollbackFor

在您的情况下,删除属性rollbackFor并检查行为

答案 1 :(得分:0)

默认@Transaction使用 以这种方式propagation = Propagation.REQUIRED你必须尝试使用​​:

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

它会起作用。

答案 2 :(得分:0)

更新:好的,我现在已经开始工作了。我尝试了很多不起作用的东西,但是清洁解决方案和重新构建部署可以解决问题(?)。为什么会出现这种情况,我不知道。

答案 3 :(得分:0)

您没有在Spring中显式启用事务管理。您可以通过在spirng配置文件中添加以下配置来启用注释驱动的事务管理

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