【发布时间】:2016-09-15 14:03:33
【问题描述】:
我正在尝试让 Spring Transaction Management 在我的新 Spring Boot + MyBatis 应用程序中工作。
到目前为止,我已经设法让所有问题都解决了——它只是让@Transactional 注释正常工作。目前,无论方法是否注解,所有语句都会立即提交。
Spring Boot 为您做了很多样板配置,以至于很难找到缺少的链接。
我的build.gradle 包含以下依赖项:
compile("org.springframework.boot:spring-boot-starter-amqp")
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.0.0")
compile("mysql:mysql-connector-java:5.1.38")
我的application.properties 包含以下数据源配置:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/my_db
spring.datasource.username=my_user
spring.datasource.password=my_pass
bean 中的方法未按预期运行的简单示例如下:
@Transactional
public void performTransactionTest() throws Exception {
Person person = new Person();
person.setPersonId(123);
personMapper.insert(person);
throw new Exception("This should force a rollback!");
}
异常被抛出,但记录已被插入。
目前基本上没有关于 Spring Boot 和 MyBatis 的事务配置的文档,但据我了解,它应该主要连接自己,就像在 Spring + MyBatis 应用程序中手动完成的那样,但它没有- 我们可以进一步配置它。话虽如此,我在applicationContext.xml 中尝试了以下配置,但没有成功:
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
<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" />
</bean>
我可以确认,即使没有上述任何配置,DataSourceTransactionManager 也配置了 MyBatis 映射器的 SqlSession 使用的相同 DataSource。
任何可以将我推向正确方向的帮助或想法将不胜感激。如果您需要任何进一步的信息,我很乐意提供!
提前致谢!
山德尔
【问题讨论】:
-
注释私有方法没有任何好处。见stackoverflow.com/q/7085271/217324
-
已编辑问题 - 我可以通过公共方法确认问题仍然存在。
-
默认情况下,检查异常不会导致回滚。
-
你也可以发布插入方法代码吗?您是使用
sqlSession插入还是仅使用@Insert映射器注释?如果您使用sqlSession,请发布有关如何创建对象的相关代码。当我开始研究 mybatis 时,同样的方法也适用于我。我只在方法级别使用了@Transactional。 -
我正在使用 mybator 生成的映射器,它创建映射器接口(无注释)和一个包含插入/更新 sql 查询的匹配 sql 映射器文件。 SqlSession 由 Spring 自动连接。
标签: java transactions spring-boot mybatis