声明市事务是利用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过来; */
时间: 2024-10-01 10:33:00