天天看點

Spring的聲明式事務--注解步驟聲明式事務的原理

步驟

1.導入相關依賴

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>      

2.配置資料源

@Bean
public DataSource dataSource() throws Exception{
   ComboPooledDataSource dataSource = new ComboPooledDataSource();
   dataSource.setUser("root");
   dataSource.setPassword("123456");
   dataSource.setDriverClass("com.mysql.jdbc.Driver");
   dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
   return dataSource;
}

//
@Bean
public JdbcTemplate jdbcTemplate() throws Exception{
   //Spring對@Configuration類會特殊處理;給容器中加元件的方法,多次調用都隻是從容器中找元件
   JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
   return jdbcTemplate;
}      

3.給方法上标注@Transactional

@Transactional
public void insertUser(){
   userDao.insert();
   //otherDao.other();xxx
   System.out.println("插入完成");
   int i = 10/0;
}      

[email protected]開啟基于事務的注解

Spring的聲明式事務--注解步驟聲明式事務的原理

5.配置事務管理器管理事務

//注冊事務管理器在容器中
@Bean
public PlatformTransactionManager transactionManager() throws Exception{
   return new DataSourceTransactionManager(dataSource());
}      

聲明式事務的原理

* 原理:
* 1)、@EnableTransactionManagement
*        利用TransactionManagementConfigurationSelector給容器中會導入元件
*        導入兩個元件
*        AutoProxyRegistrar
*        ProxyTransactionManagementConfiguration
* 2)、AutoProxyRegistrar:
*        給容器中注冊一個 InfrastructureAdvisorAutoProxyCreator 元件;
*        InfrastructureAdvisorAutoProxyCreator:?
*        利用後置處理器機制在對象建立以後,包裝對象,傳回一個代理對象(增強器),代理對象執行方法利用攔截器鍊進行調用;
*
* 3)、ProxyTransactionManagementConfiguration 做了什麼?
*        1、給容器中注冊事務增強器;
*           1)、事務增強器要用事務注解的資訊,AnnotationTransactionAttributeSource解析事務注解
*           2)、事務攔截器:
*              TransactionInterceptor;儲存了事務屬性資訊,事務管理器;
*              他是一個 MethodInterceptor;
*              在目标方法執行的時候;
*                 執行攔截器鍊;
*                 事務攔截器:
*                    1)、先擷取事務相關的屬性
*                    2)、再擷取PlatformTransactionManager,如果事先沒有添加指定任何transactionmanger
*                       最終會從容器中按照類型擷取一個PlatformTransactionManager;
*                    3)、執行目标方法
*                       如果異常,擷取到事務管理器,利用事務管理復原操作;
*                       如果正常,利用事務管理器,送出事務      

繼續閱讀