2017-07-24 2 views
0

ich Frühling 4.3.9.RELEASETransaktions nicht Rollback nicht

Einige configs und Code:

@Configuration 
@EnableTransactionManagement 
public class PersistenceContext { 

    @Autowired 
    private DbConfiguration dbConfiguration; 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 

     final BoneCPDataSource dataSource = new BoneCPDataSource(); 

     dataSource.setDriverClass(dbConfiguration.getDriverClassName()); 
     dataSource.setJdbcUrl(dbConfiguration.getUrl()); 
     dataSource.setUsername(dbConfiguration.getUsername()); 
     dataSource.setPassword(dbConfiguration.getPassword()); 
     dataSource.setIdleConnectionTestPeriodInMinutes(dbConfiguration.getIdleConnectionTestPeriod()); 
     dataSource.setIdleMaxAgeInMinutes(dbConfiguration.getIdleMaxAgeInMinutes()); 
     dataSource.setMaxConnectionsPerPartition(dbConfiguration.getMaxConnectionsPerPartition()); 
     dataSource.setMinConnectionsPerPartition(dbConfiguration.getMinConnectionsPerPartition()); 
     dataSource.setPartitionCount(dbConfiguration.getPartitionCount()); 
     dataSource.setAcquireIncrement(dbConfiguration.getAcquireIncrement()); 
     dataSource.setStatementsCacheSize(dbConfiguration.getStatementsCacheSize()); 

     return dataSource; 
    } 

    @Bean(name = "txManager") 
    public DataSourceTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 
} 

Servlet:

<?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:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> 

    <context:annotation-config/> 

    <context:component-scan base-package="ru.org.*"/> 

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

    <mvc:annotation-driven /> 
</beans> 

WebConfig:

@Configuration 
    @EnableScheduling 
    @EnableWebMvc 
    @ComponentScan({"ru.org.*"}) 
    @EnableTransactionManagement 
    public class WebConfig extends WebMvcConfigurerAdapter { 


     @Bean 
     public MainHandler mainHandler() { 
      return new MainHandler(); 
     } 
    } 

Handler:

public class MainHandler extends AbstractUrlHandlerMapping { 

    @Autowired 
    private DataSource dataSource; 

    protected Object getHandlerInternal(final HttpServletRequest request) throws Exception { 
     transactionalTest(); 
    } 

    @Transactional(transactionManager = "txManager") 
    private void transactionalTest() { 

     final JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
     jdbcTemplate.execute("INSERT INTO marks(score) VALUES (1);"); 
     jdbcTemplate.execute("IN3ERT INTO marks(score) VALUES (1);"); 
    } 
} 

Es wird eine Ausnahme ausgelöst, aber es ist kein Rollback aufgetreten.

Auch ich habe versucht, rollbackFor -param zu verwenden und löst genau diese Ausnahme.

Irgendwelche Ideen?

+2

Die transactionalTest Methode in der Dienstklasse sein sollte. Das ist die Klasse mit '@ Service' Annotation – Perry

+0

Wie haben Sie Ihre' MainHandler 'Klasse kommentiert? –

+1

'@ Transactional' funktioniert nicht auf privaten Methoden https://stackoverflow.com/questions/4396284/does-spring-transactional-attribute-work-on-a-private-method – alfcope

Antwort

1

Es gibt zwei wichtige Regeln von @Transaction Anmerkung Sie im Auge behalten müssen

  1. @Transaction wird funktionieren, wenn die kommentierten Methode nicht in die gleiche Klasse deklariert ist, dass es (True für Standard-Feder Proxy AOP ruft).
  2. @Transaction funktioniert, wenn sie mit einer öffentlichen Methode kommentiert wird. Es wird immer ignoriert, wenn die Methode privat, geschützt oder Paket sichtbar ist.

Also, was Sie tun sollen,

eine öffentliche transactionalTest() Methode in einer @Service kommentierten Klasse delcare und es dann in MainHandler Klasse nennt

Verwandte Themen