java - Spring/MyBatis 事务回滚

标签 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 类中按以下方式使用。

@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() 中对数据库的更改应该回滚,但由于某种原因它们仍然存在。我缺少什么?这是我的 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>

最佳答案

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

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

关于java - Spring/MyBatis 事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590696/

相关文章:

java - 使用Powershell用tomcat servlet-api.jar编译java

rest - 如何在 spring boot 中使用 "web request by spring mvc"和 "rest by jersey"

java - 使用 HttpServletRequestWrapper 进行复制后缺少所需的请求正文

java - LOG4J:使用自定义附加程序修改记录的消息

java - 该命令适用于终端但不适用于 java 程序

java - 如何将 2 个变量与 <c :if> 进行比较

java - 跨所有方法的单一连接

java - Spring Web 服务客户端和服务器 - 未找到端点映射

java - 我如何验证一个人是否上传了文件

java - ListView onTouch 运动事件