1

1 Spring中AOP事务简介

1.1 事务

事务(Transaction)是一个业务,是一个不可分割的逻辑工作单元,基于事务可以更好的保证业务的正确性。

1.2 事务特性: (ACID特性)

原子性(Atomicity):一个事务中的多个操作要么都成功要么都失败
一致性(Consistency): 操作前后总数应该是一致的。
隔离性(Isolation):事务与事务之间是相互隔离的
持久性(Durability):事务一旦提交数据会持久保存到数据库

2 Spring中事务管理

2.1spring中事务方式概述

Spring框架中提供了一种声明式事务的处理方式,此方式基于AOP代理,可以将具体业务逻辑与事务处理进行解耦。也就是让我们的业务代码逻辑不受污染或少量污染,就可以实现事务控制。

在SpringBoot项目中,其内部提供了事务的自动配置,当我们在项目中添加了指定依赖spring-boot-starter-jdbc时,框架会自动为我们的项目注入事务管理器对象,最常用的为DataSourceTransactionManager对象。

2.2实际项目中最常用的注解方式的事务管理

基于@Transactional 注解进行声明式事务管理的实现步骤

1) 启用声明式事务管理,在项目启动类上添加@EnableTransactionManagement,咱们新版本中也可不添加(例如新版Spring Boot项目)。

2) 将@Transactional注解添加到合适的业务类或方法上,并设置合适的属性信息。

2.3 AOP 编程中基于注解方式的事务控制@Transactional

2.3.1@Transactional描述类表示类中所有方法都要进行事务控制,假如方法上也有该注解则方法上的事务注解特性优先级比较高
2.3.2 readOnly属性 含义:是否为只读事务(只允许查询操作 其他操作不允许) 默认值是false。readOnly=false所注解的方法或类代表增加,删除,修改业务.readOnly=true代表读取数据
2.3.3 rollbackFor属性含义是(什么异常回滚事务) 默认值是(RuntimeException与Error 出现这俩个都会回滚事务 但是检查异常(IllegalAccessException)不回滚)
2.3.4 noRollbackFor属性 含义是什么(什么情况下不回滚),没有默认值
2.3.5 timeout 属性
含义为是否支持事务超时,默认没有值,若为-1默认不支持事务超时,我们可以定义超时时间。如果配置了具体时间,则超过该时间限制但事务还没有完成,则自动回滚事务。这个时间的记录方式是在事务开启以后到sql语句执行之前。
2.3.6 isolation=Isolation.READ_COMMITTED (默认写成它就行 不出现脏读),把事务隔离级别设置为它,不允许出现脏读(事务隔离级别较低)。隔离级别越高并发就会越小,性能越差,但更安全。

事务控制过程分析

image
Spring事务管理是基于接口代理(JDK)或动态字节码(CGLIB)技术,然后通过AOP实施事务增强的。当我们执行添加了事务特性的目标方式时,系统会通过目标对象的代理对象调用DataSourceTransactionManager对象,在事务开始的时,执行doBegin方法,事务结束时执行doCommit或doRollback方法。

3 Spring 中事务传播特性

事务传播(Propagation)特性指"不同业务(service)对象"中的事务方法之间相互调用时,事务的传播方式。

3.1常用事务传播方式

3.1.1@Transactional(propagation=Propagation.REQUIRED)
如果没有事务创建新事务, 如果当前有事务参与当前事务, Spring 默认的事务传播行为是PROPAGATION_REQUIRED,它适合于绝大多数的情况。

//代码示例
@Transactional(propagation = Propagation.REQUIRED)

 @Override

 public List<Node> findZtreeMenuNodes() {

 return sysMenuDao.findZtreeMenuNodes();

 }

当有一个业务对象调用如上方法时,此方法始终工作在一个已经存在的事务方法,或者是由调用者创建的一个事务方法中。
3.1.2@Transactional(propagation=Propagation.REQUIRES_NEW)
必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务。

//代码示例
@Transactional(propagation = Propagation.REQUIRES_NEW)

 @Override

 public void saveObject(SysLog entity) {

 sysLogDao.insertObject(entity);

 }

当有一个业务对象调用如上业务方法时,此方法会始终运行在一个新的事务中。


随风
13 声望1 粉丝

任重而道远


引用和评论

0 条评论