Spring-事务

Spring 中事务简介

事务定义:
事务(Transaction)是一个业务,是一个不可分割的逻辑工作单元,基于事务可以更好的保证业务的正确性。
事务特性:
事务具备ACID特性,分别是:
原子性(Atomicity):一个事务中的多个操作要么都成功要么都失败。
一致性(Consistency):(例如存钱操作,存之前和存之后的总钱数应该是一致的。
隔离性(Isolation):事务与事务应该是相互隔离的。
持久性(Durability):事务一旦提交,数据要持久保存。
说明:目前市场上在事务一致性方面,通常会做一定的优化,比方说只要最终一致就可以了,这样的事务我们通常会称之为柔性事务(只要最终一致就可以了).
4.1.3案例分析
现有两个订单业务操作,在下单时需要执行更新库存。
当库存充足时,如图-11所示:
在这里插入图片描述
图-11
当库存不足时,如图12所示:
在这里插入图片描述
图-12
Spring提供了两种事务管理方式, 编程式事务和声明式事务。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。通过声明式事务管理可以更好使业务代码逻辑不受污染或少量污染, 因此在实际使用中声明式事务用的比较多。
Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑的开发上,这是一件可以被拿来顶礼膜拜的事情。从具体配置实现上,Spring框架提供了两种配置方式:一种是基于xml方式做配置实现,另一种是基于@Transactional 注解进行配置实现。
SpringBoot项目,其内部提供了事务的自动配置机制,当我们使用spring-boot-starter-jdbc时,框架会自动为我们的项目注入DataSourceTransactionManager对象 r。这个事务管理器都实现了Spring中提供的PlatformTransactionManager接口,它是Spring的事务核心接口。
4.2.2Spring 中事务管理实现
本小节重点讲解实际项目中最常用的声明式事务管理,以注解@Transactional配置方式为例,进行实践分析。
基于@Transactional 注解进行声明式事务管理的实现步骤分为两步:
1)启用声明式事务管理,在配置类上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot项目)。
2)将@Transactional 注解添加到合适的业务类或方法上,并设置合适的属性信息。
其代码示例如下:
@Transactional(timeout = 30,
readOnly = false,
isolation = Isolation.READ_COMMITTED,
rollbackFor = Throwable.class
)
@Service
public class SysUserServiceImpl implements SysUserService {
@Transactional(readOnly = true)
@Override
public PageObject findPageObjects(
String username, Integer pageCurrent) {

}
}

其中,代码中的@Transactional注解用于描述类或方法,告诉spring框架我们要在此类的方法执行时进行事务控制,其具体说明如下:。
当@Transactional注解应用在类上时表示类中所有方法启动事务管理,并且一般用于事务共性的定义。
当@Transactional描述方法时表示此方法要进行事务管理,假如类和方法上都有@Transactional注解,则方法上的注解一般用于事务特性的定义。
@Transactional 常用属性应用说明:
timeout 事务的超时时间,默认值为-1,表示没有超时显示。如果配置了具体时间,则超过该时间限制但事务还没有完成,则自动回滚事务。
read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
isolation事务的隔离级别,默认值采用 DEFAULT。
Spring 中事务控制过程分析,如图-13所示:

在这里插入图片描述
图-13

4.2.3Spring 中事务传播特性
事务传播(Propagation)特性指"不同业务(service)对象"中的事务方法之间相互调用时,事务的传播方式,如图-14所示:
在这里插入图片描述
图-14
其中,常用事务传播方式如下:
@Transactional(propagation=Propagation.REQUIRED) 。
如果没有事务创建新事务, 如果当前有事务参与当前事务, Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设 ServiveX#methodX() 都工作在事务环境下(即都被 Spring 事务增强了),假设程序中存在如下的调用链:
Service1#method1()->Service2#method2()->Service3#method3(),那么这 3 个服务类的 3 个方法通过 Spring 的事务传播机制都工作在同一个事务中。如图-15所示:

在这里插入图片描述
图-15
代码示例如下:
@Transactional(propagation = Propagation.REQUIRED)
@Override
public List findZtreeMenuNodes() {
return sysMenuDao.findZtreeMenuNodes();
}

@Transactional(propagation=Propagation.REQUIRES_NEW)。
必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务,如图-16所示:
在这里插入图片描述
图-16
代码示例如下:
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveObject(SysLog entity) {
sysLogDao.insertObject(entity);
}

4.3Spring 中事务原理分析
Spring 事务管理是基于接口代理(JDK)或动态字节码(CGLIB)技术,然后通过 AOP 实施事务增强的。
以DataSourceTransactionManager为例,在DataSourceTransactionManager中,在事务开始的时候,会调用doBegin方法,首先会得到相对应的Connection,然后可以根据事务设置的需要,对Connection的相关属性进行配置,比如将Connection的autoCommit功能关闭等。
4.1Spring 中事务管理小结
Spring 声明式事务是 Spring 最核心,最常用的功能。由于 Spring 通过 IOC 和 AOP 的功能非常透明地实现了声明式事务的功能,对于一般的开发者基本上无须了解 Spring 声明式事务的内部细节,仅需要懂得如何配置就可以了。但对于中高端开发者还需要了解其内部机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值