spring framework の宣言的トランザクション管理ができない
Spring Framework と MyBatis を使用してアノテーションによる
宣言的トランザクション管理を行おうとしていますが、ロールバックされません。
設定に不備があると思うのですが、何が悪いか検討がつかない状態です。
不備などありましたらご指摘してくださると助かります。
コード修正してプログラムによるトランザクション管理も試したところ、こちらは可能でした。
【pom.xml】
<!-- 省略 -->
<properties>
<java-version>1.8</java-version>
<org.springframework-version>4.0.3.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- 省略 -->
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 省略 -->
【root-context.xml】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop ="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://****.com:5432/****" />
<property name="username" value="****" />
<property name="password" value="****" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:com/hatak/photomap/domain/mapper/*.xml" />
<property name="typeAliasesPackage" value="com.hatak.photomap.domain.entity" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.hatak.photomap.domain.mapper" />
</bean>
</beans>
【サービスクラス】
@Service
public class HomeServiceImpl implements HomeService {
@Autowired
private MessagesMapper messagesMapper;
@Transactional(readOnly = false, rollbackFor = RuntimeException.class)
public void execute(HomeServiceDto homeServiceDto) throws Exception {
// DB更新
MessagesEntity entity = new MessagesEntity();
entity.setId(13);
entity.setMessage(homeServiceDto.getMessage());
int count = messagesMapper.update(entity);
// 強制ロールバック
if (count == 1) {
throw new RuntimeException("ロールバックしてない");
}
}
}