Aop事务小结(事务管理器和自身构建)
声明市事务是利用AOP来实现的。
1、采用事务管理器AOP:
<!--3、配置事务切面;控制住连接池 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="comboPooledDataSource"></property> </bean> 2、配置开启基于注解的事务控制 <tx:annotation-driven/> 3、给事务方法上加注解 @Transactional
2、自身构建AOP
基于注解的AOP
1)对切面类的方法进行配置
2)将切面类和业务逻辑组件都加入到容器
3)告诉SpringIOC容器哪个类是切面类@Aspect
4)开启基于注解的AOP功能
基于XML的AOP
1)对切面类的方法进行配置
2)将切面类和业务逻辑组件都加入到容器
3)告诉SpringIOC容器哪个类是切面类@Aspect
在其他类中本类事务,才会分大小方法的事务特性。
/**
* 结果:没有任何事务特性;
*
* 本类调用本类事务;
* 1、现象:大方法是默认REQUIRED
* 小方法两个都设置了REQUIRES_NEW,但是没用
* 2、现象:大方法是默认REQUIRES_NEW
* 小方法两个都设置了REQUIRES_NEW,但是没用
* 3、现象:大方法是默认REQUIRES_NEW
* 小方法两个都是REQUIRED,还是没用
*
* 为什么?怎么调都调整不了一个回滚一个不回滚?
* MulService{
* BookService bs = 代理;
* mulTx(){
* //代理.方法()
* bs.checkout();
* bs.updatePrice();
* }
* }
*
*
* //两个小事务怎么设置都不行,都是一起滚;
* BookService{
* //
* hahah(){
* //自己方法;把这个方法cv过来
* checkout();
* //cv进haha
* updatePrice();
* }
* }
*
* {
* hahah(){
* int price = bookDao.getPrice(isbn);
//1、减用户余额
bookDao.updateBalance(price, username);
//2、减图书的库存
bookDao.updateStock(isbn);
bookDao.updatePrice(isbn);
* }
* }
* 原因:
* 所有切入了事务的业务逻辑组件,在ioc容器中保存的是这个组件的代理对象;
* 本类直接调用本类方法,就相当于是将本类的方法的代码,cv进当前方法里面
* 现象就是其实只有一个事务,就是hahah();
*
* 类编译;
* 本类方法调用本类方法,相当于将另外一个方法的实现cv过来;
*/
因为追求卓越,成功在不经意间追上了你