Java Spring/MyBatis事务回滚

Java Spring/MyBatis事务回滚,java,spring,spring-mvc,mybatis,Java,Spring,Spring Mvc,Mybatis,我尝试将Spring的事务管理器与MyBatis mapper结合使用,如下所示 @Service("myService") class MyServiceImpl implements MyService { @Autowired private MyMapper myMapper; @Transactional( value = "transactionManager", propagation = Propagati

我尝试将Spring的事务管理器与MyBatis mapper结合使用,如下所示

@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映射。 我的实际代码与此稍有不同,但我已将其修改为类似。 该服务在控制器类中以以下方式使用

@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>

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


在您的情况下,删除属性rollbackor,并在未检查/运行时异常上检查默认情况下Spring@Transactional回滚的行为。 只有当您针对特定的已检查异常/自定义异常时,才能使用属性ROLLBAFFOR


在您的情况下,删除属性rollboor并检查默认情况下的行为
@Transaction
use
propagation=propagation.REQUIRED
这样,您必须尝试使用:

@Transactional(value=“transactionManager”,isolation=isolation.READ\u COMMITTED)


它将起作用。

默认情况下
@Transaction
使用
propagation=propagation.REQUIRED
这样,您必须尝试使用:

@Transactional(value=“transactionManager”,isolation=isolation.READ\u COMMITTED)


它会工作的。

更新:好的,我现在让它工作了。我尝试了许多不起作用的方法,但清洗解决方案和重新制作可部署解决方案成功了(?)。为什么会是这样,我不知道。

更新:好的,我现在已经让它工作了。我尝试了许多不起作用的方法,但清洗解决方案和重新制作可部署解决方案成功了(?)。为什么会这样,我不知道。

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

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

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

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


@codemonkey86531在spring上下文之外的这两个操作之间是否存在任何显式查询交互?另外,您使用的是什么DB驱动程序。这只是供我参考(1)不,不是在服务中(2)只是普通的老mysqlJDBC@codemonkey_86531在spring上下文之外,这两个操作之间是否存在任何显式查询交互?另外,您使用的是什么DB驱动程序。这只是供我参考(1)不,不是在服务中(2)只是普通的老mysql JDBC