2017-04-25 14 views
0

データベースにデータを挿入するメソッドにSpring Jdbcと@Transactionアノテーションを使用しています。コードのスニペットは、次のとおりです。機能tripDao.saveTripData(trip, userId)インサイド@トランザクションが春にトランザクションをロールバックしない

@Transactional(rollbackForClassName={"Exception"}) 
    public PreBookingResponse saveData(Tip trip, HttpServletRequest request) throws Exception { 
     PreBookingResponse preBookingResponse = null; 
     try { 
      String bookingRefNo = "89"; 
      trip.setBookingRefNo(bookingRefNo); 
      MinimumUserProfile userProfile = JwtService.getUserFromToken(request); 
      String userId = userProfile.getUserId(); 

      if (tripDao.saveTripData(trip, userId)) { 
       preBookingResponse = new PreBookingResponse(0, ""); 
       preBookingResponse.setBookingRefNo(bookingRefNo); 
       preBookingResponse.setSearchId(trip.getSearchId()); 
       preBookingResponse.setId(trip.getId()); 
      } 
     }catch(Exception e) 
     { 
      String errorMsg = "Error occur while saving trip data due to: " + e.getMessage(); 
      log.error(errorMsg); 
      preBookingResponse = new PreBookingResponse(2, errorMsg); 
      preBookingResponse.setBookingRefNo(trip.getBookingRefNo()); 
      preBookingResponse.setSearchId(trip.getSearchId()); 
      throw e; 
     } 
     return preBookingResponse; 
    } 

私は複数のテーブルにデータをinsrtingています。データの挿入中に例外が発生すると、すべての挿入操作はロールバックされますが、挿入操作はロールバックされません。

マイspring-config.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:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 


    <!-- Enable Annotation based Declarative Transaction Management --> 
    <tx:annotation-driven proxy-target-class="true" 
     transaction-manager="transactionManager" /> 



    <!-- Creating TransactionManager Bean, since JDBC we are creating of type 
     DataSourceTransactionManager --> 
    <bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <!-- MySQL database connection --> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="url" value="jdbc:mysql://localhost:3306/aapi"></property> 
     <!-- Changed to mysql-connector-java 5.x since 6 is in beta phase --> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
     <property name="username" value="root"></property> 
     <property name="password" value="root"></property> 
    </bean> 

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource"></property> 
    </bean> 
</beans> 

私のbuild.gradleは以下のとおりです。

buildscript { 
    ext { 
     springBootVersion = '1.5.2.RELEASE' 
    } 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 


apply plugin: 'java' 
apply plugin: 'eclipse-wtp' 
apply plugin: 'org.springframework.boot' 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

repositories { 
    jcenter() 
} 

dependencies { 
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.2.RELEASE' 
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.2.RELEASE' 

    compile project(':supplier-commons') 
    runtime project(':supplier-commons') 

    compile 'org.springframework:spring-context:4.2.6.RELEASE' 
    compile 'org.springframework:spring-webmvc:4.2.6.RELEASE' 
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6' 
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.7' 
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.7' 
    compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version: '2.4.1' 
    compile 'io.jsonwebtoken:jjwt:0.7.0' 
    compile group: 'javax.mail', name: 'mail', version: '1.4' 
    compile group: 'freemarker', name: 'freemarker', version: '2.3.9' 
    compile group: 'org.springframework.security', name: 'spring-security-crypto', version: '4.2.2.RELEASE' 
    compile group: 'org.apache.commons', name: 'commons-email', version: '1.4' 
    compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.9' 
    compile group: 'org.jmockit', name: 'jmockit', version: '1.8' 
    compile 'io.jsonwebtoken:jjwt:0.7.0' 
    compile group: 'com.ning', name: 'async-http-client', version: '1.6.4' 
    compile group: 'org.mockito', name: 'mockito-all', version: '1.8.4' 
    compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.0.7' 

    runtime('org.springframework.boot:spring-boot-devtools') 
    compileOnly('org.springframework.boot:spring-boot-configuration-processor') 
    compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.8' 
    // https://mvnrepository.com/artifact/org.springframework/spring-tx 
    compile group: 'org.springframework', name: 'spring-tx', version: '4.1.4.RELEASE' 
    // https://mvnrepository.com/artifact/org.eclipse.persistence/javax.persistence 
compile group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.1.0' 
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-core 

    // https://mvnrepository.com/artifact/org.hibernate/hibernate-core 
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.5.Final' 
    // https://mvnrepository.com/artifact/org.springframework/spring-orm 
compile group: 'org.springframework', name: 'spring-orm', version: '4.3.8.RELEASE' 
    // https://mvnrepository.com/artifact/org.hibernate/hibernate 
compile group: 'org.hibernate', name: 'hibernate', version: '3.2.6.ga' 

    testCompile 'junit:junit:4.12' 

} 

springBoot { 
    executable = true 
} 

eclipse { 

    wtp { 
    facet { 
     facet name: 'jst.web', version: '2.4' 
    } 

    component { 
     contextPath = 'aggregator-api' 
    } 

    } 
} 

トランザクションがロールバックされていないのはなぜ?

答えて

0

このコードはトランザクションにロールバックを行わないため、例外はメソッドにスローされません。

@Transactional(rollbackForClassName = {"Exception"})は、このメソッドから例外がスローされたときにトランザクションをロールバックすることを意味します。しかし、あなたの場合、例外をキャッチして、適切な応答を返すので、トランザクションはコミットされます。 Springは、このメソッド呼び出しの周りのAOPトランザクションアドバイスを作成します。このメソッド呼び出しは、正常にメソッドが返された場合は正常にコミットし、このメソッドから例外がスローされた場合はロールバックします。いずれかのロールバックスロー例外をこの方法から、または別の方法しようとするブロック内のコードを移動し @Transactional(rollbackForClassName = {「例外」})とそのメソッドに注釈を付ける

+0

この関数から例外がスローされます。 catchブロックの最後の行を参照してください。 –

0

あなたがdefaultAutoCommitを無効にする必要がdataSource

関連する問題