Spring事务管理

1. 事务的基本概念

事务是一组操作的集合,是数据库操作中的最小单元,必须保证事务中的操作要么全部成功,要么全部失败。事务的四大特性 (ACID) 包括:

  • 原子性:事务要么全部完成,要么全部撤销。
  • 一致性:事务完成后,数据库状态必须一致。
  • 隔离性:不同事务之间相互隔离,避免干扰。
  • 持久性:一旦事务提交,结果必须永久保存。

事务的操作主要包括:

  1. 开启事务begin transaction;
  2. 提交事务commit;
  3. 回滚事务rollback;

2. Spring 事务管理

Spring 通过 @Transactional 注解实现事务管理,简化了手动事务控制。@Transactional 注解作用在方法或类上,控制事务的开启、提交或回滚:

  • 成功提交:当方法正常执行完毕时,事务提交。
  • 回滚:当方法执行中抛出异常时,事务回滚。

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在 一个事务范围内。

@Transactional注解书写位置:

(1)方法

当前方法交给spring进行事务管理

(2)类

当前类中所有的方法都交由spring进行事务管理

(3)接口

接口下所有的实现类当中所有的方法都交给spring 进行事务管理

说明:可以在application.yml配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的 日志信息了。

#spring事务管理日志
logging:
 level:
 org.springframework.jdbc.support.JdbcTransactionManager: debug

@Transactional注解当中的两个常见的属性:

(1)异常回滚的属性:rollbackFor

(2)事务传播行为:propagation

3. 事务回滚机制(rollbackFor)

默认情况下,Spring 仅在出现运行时异常 (RuntimeException) 时回滚事务。如果希望对其他异常也进行回滚,可以通过 rollbackFor 属性配置,例如让所有的异常都回:

@Transactional(rollbackFor = Exception.class)

4. 事务传播行为 (propagation)

4.1 事务传播行为介绍

当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

例如:两个事务方法,一个A方法,一个B方法。在这两个方法上都添加了@Transactional注解,就代表这两个方法都具有事务,而在A方法当中又去调用了B方法。

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。

4.2 应用案例

当我们不希望事务之间相互影响时,可以使用REQUIRES_NEW传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

@Service
public class DeptLogServiceImpl implements DeptLogService {
    @Autowired
    private DeptLogMapper deptLogMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)//事务传播
行为:不论是否有事务,都新建事务
    @Override
    public void insert(DeptLog deptLog) {
        deptLogMapper.insert(deptLog);
     }
}

此时,下单servicesave方法运行时,会开启一个事务。 当调用deptLogService.insert(deptLog) 时,也会创建一个新的事务,那此时,当insert方法运行完毕之后,事务就已经提交了。 即使外部save的事务出现异常,内部已经提交的事务,也不会回滚了,因为是两个独立的事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值