2017-10-05 1 views
0

habe ich versucht Spring Transaktionsmanager mit Mybatis Mapper wie folgt in einer Implementierung eines ServiceFrühjahr/Mybatis Transaktionsrollbacks

@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(); 
    } 
} 

wo MyMapper abgebildet durch Mybatis zu verwenden. Mein tatsächlicher Code ist ein bisschen anders, aber ich habe ihn geändert, um How to use @Transactional annotation in mybatis-spring? zu ähneln. Der Dienst wird in der Controller-Klasse wie folgt verwendet.

@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"; 
    } 
} 

Von dem, was ich sammeln, Änderungen an DB in DO1() und do2() sollte zurückgerollt werden, aber sie bestehen aus irgendeinem Grund. Was vermisse ich? Hier ist meine XML-Konfigurations

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

Antwort

0

Frühling @Transactional durch Standard-Rollback auf der ungeprüften/Runtime-Ausnahme. Das Attribut rollbackFor darf nur verwendet werden, wenn Sie eine bestimmte geprüfte Ausnahme sind Targeting/maßgeschneiderte eine

In Ihrem Fall das Attribut rollbackFor entfernen und überprüfen Sie das Verhalten

+0

Nö, verhält es sich immer noch die gleiche Art und Weise –

+0

@ codemonkey_86531 Gibt es eine explizite Anfragen zwischen diesen beiden Betrieb außerhalb des Feder Kontext interagierten werden? Außerdem, welcher DB-Treiber Sie verwenden. Dies ist nur für meine Information – Rizwan

+0

(1) Nein, nicht im Service (2) einfach nur alte mysql JDBC –

0

standardmäßig @Transaction Verwendung propagation = Propagation.REQUIRED auf diese Weise müssen Sie versuchen, Verwendung:

@Transactional(value = "transactionManager", isolation = Isolation.READ_COMMITTED)

es funktioniert wird.

0

UPDATE: Ok, ich habe es jetzt arbeiten habe. Ich habe viele Dinge ausprobiert, die nicht funktionierten, aber Reinigungslösung und Remake entfalteten den Trick (?). Warum sollte das der Fall sein? Ich habe keine Ahnung.