步驟
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]開啟基于事務的注解

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)、執行目标方法
* 如果異常,擷取到事務管理器,利用事務管理復原操作;
* 如果正常,利用事務管理器,送出事務