【问题标题】:Spring/MyBatis transactional rollbackSpring/MyBatis 事务回滚
【发布时间】:2017-10-05 16:35:12
【问题描述】:

我尝试在服务实现中使用 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>

【问题讨论】:

    标签: java spring spring-mvc mybatis


    【解决方案1】:

    Spring @Transactional 默认回滚未检查/运行时异常。 只有当您针对特定的已检查异常/自定义异常时,才必须使用属性 rollbackFor

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

    【讨论】:

    • @codemonkey_86531 在 spring 上下文之外的这两个操作之间是否有任何显式查询正在交互?另外,您使用的是什么数据库驱动程序。仅供参考
    • (1) 不,不在服务中 (2) 只是普通的旧 mysql JDBC
    【解决方案2】:

    默认使用@Transaction propagation = Propagation.REQUIRED 这样你必须尝试使用​​:

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

    它会起作用的。

    【讨论】:

      【解决方案3】:

      更新:好的,我现在可以正常工作了。我尝试了很多没有用的东西,但是清理解决方案和重新制作可部署的技巧(?)。为什么会这样,我不知道。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-27
          • 2020-02-06
          • 2020-03-16
          • 2011-11-21
          • 2016-09-19
          • 2017-03-03
          • 2012-03-10
          • 2018-07-15
          相关资源
          最近更新 更多