@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注解的方法,表示该方法中涉及的所有操作,视为一个整体。要么全部执行成功,要么全部执行失败,这样可以避免数据不一致问题。