Ich versuche, Spring Transaction Management in meiner neuen Spring Boot + MyBatis-Anwendung arbeiten zu lassen.Spring Transaction Management funktioniert nicht mit Spring Boot + MyBatis?
Bis jetzt habe ich es geschafft, alles mit minimalen Problemen arbeiten zu lassen - es wird nur die @Transactional
Annotation richtig funktionieren. Derzeit werden alle Anweisungen sofort übernommen, unabhängig davon, ob die Methode mit Anmerkungen versehen ist oder nicht.
Spring Boot macht so viel von der Standardkonfiguration für Sie, dass es schwierig ist, das fehlende Glied zu finden.
My build.gradle
enthält die folgenden Abhängigkeiten:
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")
My application.properties
enthält die folgende Datenquelle Konfiguration:
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
Ein einfaches Beispiel für ein Verfahren in einer Bean, das wirkt, wird nicht so wie erwartet ist, folgt:
@Transactional
public void performTransactionTest() throws Exception {
Person person = new Person();
person.setPersonId(123);
personMapper.insert(person);
throw new Exception("This should force a rollback!");
}
Die Ausnahme wird ausgelöst, aber der Datensatz wurde bereits eingefügt.
Es gibt im Grunde genommen keine Dokumentation zur Transaktionskonfiguration für Spring Boot AND MyBatis zusammen, aber soweit ich weiß, sollte es sich größtenteils verkabeln, wie es manuell in einer Spring + MyBatis-Anwendung gemacht würde und wo es nicht funktioniert. t - wir können es weiter konfigurieren. Mit dieser sagte ich die folgenden Konfigurationen in meinem applicationContext.xml
ohne Glück versucht:
<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>
kann ich bestätigen, dass auch ohne eine der oben genannten Konfigurationen eine DataSourceTransactionManager mit derselben Datasource konfiguriert ist, dass die Mybatis Mapper SqlSession verwendet.
Jede Hilfe oder Ideen, die mich in die richtige Richtung drücken könnten, würde sehr geschätzt werden. Wenn Sie weitere Informationen benötigen, stelle ich Ihnen diese gerne zur Verfügung!
Vielen Dank im Voraus!
Xandel
Das Annotieren von privaten Methoden ist nicht gut. siehe http://stackoverflow.com/q/7085271/217324 –
Haben Sie die Frage bearbeitet - ich kann bestätigen, dass das Problem mit einer öffentlichen Methode weiterhin besteht. – Xandel
Auch geprüfte Ausnahmen verursachen standardmäßig kein Rollback. –