声明式事务管理(底层使用AOP)
1 Spring事务管理API
提供一个接口,代表事务管理器,针对不同的框架有不同的实现类
2 基于注解方式
(1)在Spring配置文件中配置事务管理器
(2)在Spring配置文件,开启事务的注解
先添加tx名称空间
(3)添加事务注解
@Transactional——添加在类上(所有方法都有效)或者添加到方法上面
2.1 参数配置
propagation:事务传播行为 (多事务方法之间调用,事务是怎么管理的)
ioslation:事务隔离级别
timeout:超时时间(事务需要在一定时间内提交,如果未提交就会回滚)
readOnly:是否只读
rollbackFor:设置出现哪些异常回滚
noRollbackFor:设置出现哪些异常不回滚
3 基于xml配置文件方式
- 创建事务管理器
- 配置通知
- 配置切入点和切面
<!--1 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--2 配置通知-->
<tx:advice id="txadvice">
<!--配置事务参数-->
<tx:attributes>
<!--在哪种规则的方法上添加事务-->
<tx:method name="accountMoney"/>
</tx:attributes>
</tx:advice>
<!--3 配置切入点和切面-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* test.TestBook.*(..))"/>
<!--配置切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
</aop:config>
2. 完全注解方式
@Configuration//配置类
@ComponentScan(basePackages = "com.swjtu")
@EnableTransactionManagement//开启事务注解
public class Txconfig {
//创建数据库的连接池
@Bean
public ComboPooledDataSource getDataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306");
dataSource.setUser("root");
dataSource.setPassword("123456");
return dataSource;
}
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}