@Transactional注解的使用

目录

一.介绍

1.使用@Transactional注解的位置

2.@Transactional注解的作用

二.举例

1.需求场景

2.做法

3.效果展示

三.简单总结


一.介绍

1.使用@Transactional注解的位置

        我们在Java开发中,一般在service层的方法上,使用@Transactional注解,表示方法内的所有子操作是一个整体,要么全部成功,要么全部失败。

2.@Transactional注解的作用

  @Transactional 是 Spring 框架 提供的核心事务管理注解,用于 声明式事务(Declarative Transaction Management),其核心作用是 确保数据库操作的 ACID 特性(原子性、一致性、隔离性、持久性),并在异常发生时自动回滚事务

二.举例

1.需求场景

        在医院HIS系统中,当门诊医生想要“毕诊”一个患者时,就需要在后端①修改该患者的病历状态 ②修改该患者的挂号状态。

        此时我们就必须要保证这两步操作同时成功。

        如果不同时成功,则就出现了数据不一致的问题,即:该患者的病历都被毕诊了,但是挂号状态还是看诊中。这显然是不合理的。

2.做法

//毕诊某个患者(修改患者病历状态 + 修改患者挂号状态)
@Transactional(rollbackFor = Exception.class) //出现任何异常,直接回滚,这样防止了数据不一致风险
public void finishMedical(Integer medicalId, Integer registerId) {
    try{
        //修改病历状态为state=3(诊毕)
        medicalRecordMapper.updateMedicalRecordState(medicalId, 3);
        //修改挂号状态为visitState=3(看诊结束)
        registerMapper.updateRegisterVisitState(registerId, 3);
    }catch(Exception e){
        throw new RuntimeException("毕诊操作失败,请稍后重试~");
    }
}

解读:

①一但try中的两个mapper层的方法中,有任何一个出现了异常,则该方法直接回滚,令所有操作都失效。这样就防止了数据不一致的情况。

②出现异常时,抛出运行时异常RuntimeException异常,并描述异常信息,然后就会被我们之前配置的全局异常处理器捕获,返回给前端错误信息。

3.效果展示

①成功状态下:

②失败状态下:

可见此时数据库中,该患者对应的病历表、挂号表的状态字段,没有发生变化,说明了毕诊方法确实被回滚了。

 

三.简单总结

        添加了@Transactional注解的方法,表示该方法中涉及的所有操作,视为一个整体。要么全部执行成功,要么全部执行失败,这样可以避免数据不一致问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值