2017-05-02 4 views
1

Ich möchte mehrere Einfügungen in meiner Methode durchführen und alle Einfügungen zurücksetzen, wenn etwas schief geht. Hier ist meine jdbc Bohne DefinitionWie Rollback-Transaktion in Spring JDBC?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns="http://www.springframework.org/schema/beans" 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.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <context:property-placeholder location="classpath:jdbc.properties"/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 

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

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

</beans> 

Und hier ist meine Methode

@Transactional 
public void save(Map<String, String> properties, Long moduleId, 
       String language, String propertyFileName, String filePath) { 

    KeyHolder keyHolder = new GeneratedKeyHolder(); 

    final String propertyFileQuery = "INSERT INTO property_file " + 
      "(moduleId, languageId, propertyFileName,hash,path) " + 
      "VALUES (?,?,?,?,?)"; 

    jdbcTemplate.update(connection -> { 
     PreparedStatement ps = 
       connection.prepareStatement(propertyFileQuery, new String[]{"id"}); 
     ps.setLong(1, moduleId); 
     ps.setString(2, language); 
     ps.setString(3, propertyFileName); 
     ps.setString(4, "hash goes here"); 
     ps.setString(5, filePath); 

     return ps; 
    }, keyHolder); 

    int x = 0/0; 

    final String propertiesQuery = "INSERT INTO property_value " + 
      "(propertyFileId, propKey, propValue) " + 
      "VALUES (?,?,?)"; 

    properties.forEach((key, value) -> jdbcTemplate.update(
      propertiesQuery, keyHolder.getKey(), key, value 
    )); 

} 

Ich will es den ersten Einsatz rückgängig zu machen, nachdem es die Ausnahme Laufzeit erfüllt 0/0

Aber die Daten gehen in die Datenbank und wird nicht zurückgesetzt.

Was mache ich falsch?

Antwort

0

den Grund herausgefunden haben. Das Transaktionsmanagement war in Ordnung, der Grund, warum ich meine Arbeit in einer Transaktion nicht machen konnte, war meine MySQL Engine. Es wurde auf MyISAM eingestellt. Wie in der MySQL-Website zitiert

MyISAM unterstützt keine Transaktionen und wird wahrscheinlich nie.

Nur die Tabellen von MyISAM zu InnoDb geändert, und es funktionierte.

0

Sie können @Transactional für Ihre Klasse festlegen, anstatt sie mit einzelnen Methoden zu binden, da alle Aktionen bei einer Bindung an eine Klasse an einer einzigen globalen Transaktion teilnehmen. Wenn eine Transaktion fehlschlägt, wird die Aktion zurückgesetzt

0
private PlatformTransactionManager transactionManager; 

public void setDataSource(DataSource dataSource) { 

    this.jdbcTemplate = new JdbcTemplate(dataSource); 
} 

public void setTransactionManager(PlatformTransactionManager transactionmanager) { 
    this.transactionManager = transactionmanager; 
} 

und innerhalb der Methode Sie

TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); 

und Sie haben Transaktion zu begehen

nach jdbcTemplate.update verwenden

Sie können auch verwenden @Transactional(propagation=Propagation.REQUIRED) `

+0

doens't Arbeit: / – Carmine

Verwandte Themen