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("ロールバックしてない");
            }
        }
    }
    
```
CC BY-SA 3.0
2015-05-10T13:22:05.870
10012
2016-09-09T08:28:48.863
2015-05-10T15:39:29.403
8000
9581
question
java spring
spring framework の宣言的トランザクション管理ができない
おつかれさまです。

おそらくAutoCommitが有効になっているように思われました。DataSource取得のところでCommons-
DBCPを使われているようですので、defaultAutoCommit="false"のプロパティを追加してください。

Springの宣言的トランザクション定義は問題ないようです。

以上です。
CC BY-SA 3.0
2015-05-11T01:08:50.587
10015
2015-05-11T01:08:50.587
5778
10012
answer