事务的四大特性 ACID
- 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
- 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
- 持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
spring支持编程式事务和声明式事务(推荐)spring通过spring aop框架实现
spring 使用 @Transactional 和 @EnableTransactionManagement开启事务
当事务中调用事务时,事务的7种传播行为
并发事务可能导致的问题
-
脏读:即为事务1第二次读取时,读到了事务2未提交的数据。若事务2回滚,则事务1第二次读取时,读到了脏数据。
-
不可重复读:主要在于事务2在事务1第二次读取时,提交了数据。导致事务1前后两次读取的数据不一致。
-
幻读 :事务1第二次查询时,读到了事务2提交的数据。
5种事务隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
springboot添加事务,直接在类或者方法上添加@Transactional注解
注意:事务一般添加在service层的
@Service
@Transactional
public class AyUserServiceImpl implements AyUserService {
@Override
@Transactional
public AyUser save(AyUser ayUser) {
AyUser save = ayUserRepository.save(ayUser);
// 测试事务回滚
String error = null;
error.split("/");
return save;
}
}