spring提供一种处理事务的统一模型,能使用统一的步骤,完成多种不同数据库访问技术的事务处理。
spring管理事务的三个方面
1、事务管理器
事务管理器是一个接口和它的众多实现类,由事务管理器对象完成事务的提交和回滚。
实现类:spring将每一种数据库访问技术对应的事务处理类都创建好了
mybatis访问数据库——-DateSourceTransactionManager
hibernate访问数据库———HibernateTransactionManager
使用方法:告诉spring你使用的那种数据库的访问方式
1 | <bean id=" " class=" ...DateSourceTransaction"/> |
2、事务的类型
(1)事务的隔离级别
(2)事务的超时时间
表示一个方法的最长执行时间,如果方法执行超过了该时间,事务就回滚
(3)常用的事务传播行为
- REQUIRED(Spring默认):内外层方法共用外层方法的事务,要么都成功,要么都不成功。
- REQUIRES_NEW:内外层方法相互独立,互不影响。
- NESTED:内层方法不会影响外层,外层回滚时内层也会回滚。
注: 使用代理对象调用当前类中的另外一个事务方法,不然事务会失效
1
2 1 ServiceA proxy =(ServiceA)AopContext.currentProxy();
2 proxy.b();
3、spring提交事务,回滚事务的时机
(1)业务方法执行成功,没有异常抛出,spring会在方法指向后提交事务
(2)业务方法抛出运行时异常,spring执行回滚
运行时异常定义:RuntimeException和它的子类都是运行时异常,NullPointException,NumberFormatException
(3)业务方法抛出非运行时异常,受查异常时,提交事务。
受查异常:写代码时必须处理的异常,IOException,SQLException
事务应用——购买商品项目
实现购买商品,模拟用户下订单,向订单中添加销售记录,从商品表中减少库存。
注解方式
1、在spring配置文件添加事务管理器和事务注解驱动
1 | <!-- 声明事务管理器 --> |
2、在需要使用事务的方法上添加Transactional注解
1 | public class BuyGoodsServiceImpl implements BuyGoodsService { |
使用aspectj完成事务配置
1、添加aspectj依赖
1 | <dependency> |
2、声明事务管理器
1 | <!-- 声明事务管理器 --> |
3、声明业务方法及事务属性
1 | <!-- 声明业务方法及事务属性(隔离级别、传播行为、超时时间) --> |
4、配置aop
1 | <!--配置aop --> |