SpringBoot项目的事务实现

说明:当业务中的某个功能,需要多个操作组合执行才能完成时(如删除部门,部门下的员工也需要同步删除时),为了保证数据的一致性,需要对这些组合操作添加事务。(参考:http://t.csdn.cn/6PFzL)

(根据部门ID删除员工)

    @Delete("delete from tb_emp where id=#{id}")
    void deleteByDeptId(Integer id);

(根据部门ID删除部门,要求删除部门的同时删除该部门下的所有员工)

    @Delete("delete from tb_dept where id=#{id}")
    void deleteById(Integer id);

Controller层

    @RequestMapping("deleteById")
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);

(员工表)

在这里插入图片描述

(部门表)

在这里插入图片描述

添加事务

在SpringBoot项目中,可以使用@Transactional,给方法添加事务

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动添加算数异常
        int i = 1 / 0;

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);

程序报错,事务未提交,方法未执行成功
在这里插入图片描述

去掉异常,删除ID为3的部门

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) {
        // 删除该部门
        deptMapper.deleteById(id);

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

执行成功
在这里插入图片描述
在这里插入图片描述

需要注意的是,如果抛出的是Exception异常,而不是RuntimeException异常,事务会失效。

(删除ID为4的部门,部门被删除,员工并未被删除)

    @RequestMapping("deleteById")
    @Transactional
    public void deleteById(Integer id) throws Exception {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动设置Exception异常
        if (true){
            throw new Exception("发生了错误");
        }

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

因为事务捕捉的异常默认是RuntimeException,即只有发生RuntimeException事务才会回滚。可以在@Tranctionful()注解里添加rollback = Exception.class,表示发生任何异常,都回滚事务。

    @RequestMapping("deleteById")
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(Integer id) throws Exception {
        // 删除该部门
        deptMapper.deleteById(id);

        // 手动设置Exception异常
        if (true){
            throw new Exception("发生了错误");
        }

        // 删除部门对应部门ID的员工
        empMapper.deleteByDeptId(id);
    }

事务传播

当事务方法,方法中调用的方法也被事务修饰,此时就存在事务传播。在@Transactional注解中,使用propagation属性设置,常用有以下两个值:

REQUIRED:默认值,表示调用自己的事务执行成功与否,同时也表示自己事务的状态;

REQUIRES_NEW:表示调用自己的事务执行成功与否,不会影响自己事务的执行。

例如在删除部门方法中设置一个删除部门日志方法,部门删除执行成功与否,该日志方法都执行

(DeptLogServiceImpl类,设置该事务的事务传播为:REQUIRES_NEW)

    @Autowired
    private DeptLogMapper deptLogMapper;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertDeptLog(DeptLog deptLog){
        deptLogMapper.insert(deptLog);
    }

(DeptLogMapper类)

    @Insert("insert into dept_log(create_time,description) values(#{createTime},#{description})")
    void insert(DeptLog log);

    @RequestMapping("deleteById")
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(Integer id) throws Exception {
        try {
            // 删除该部门
            deptMapper.deleteById(id);

            if (true){
                throw new Exception("发生了错误");
            }

            // 删除部门对应部门ID的员工
            empMapper.deleteByDeptId(id);
        }finally {
            // 记录删除部门日志
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("删除了ID" + id + "的部门");

            deptLogService.insertDeptLog(deptLog);
        }
    }

(删除ID为2的部门)

在这里插入图片描述

(删除部门失败,不影响添加日志)

在这里插入图片描述

在这里插入图片描述

需要注意的是,事务传播属性是加在需要设置的方法上(添加日志方法),而不是调用方法上(删除部门方法)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringBoot项目车辆管理系统是为企事业单位、汽车租赁公司以及车辆维护服务商设计的综合性车辆管理平台。它利用Spring Boot的快速开发特性,结合了车辆登记、调度管理、维修保养、费用核算、保险跟踪以及统计分析等功能,旨在提供一个高效、精确且用户友好的工具,以帮助企业简化车辆管理流程和降低运营成本。 以下是该车辆管理系统的主要功能: 1. **车辆档案管理**:记录每辆车的详细信息,包括购置信息、技术参数、使用状态等。 2. **调度与追踪**:安排车辆的日常使用和出勤,实时监控车辆位置和使用情况。 3. **维护与保养记录**:定期记录车辆的维修和保养历史,自动提醒下一次保养时间。 4. **费用与开支管理**:跟踪每辆车的燃油消耗、维修费用和其他相关开销,进行成本分析。 5. **保险事务管理**:管理车辆保险购买、续保和理赔记录,确保符合法规要求。 6. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 7. **数据安全与隐私保护**:采取加密技术和访问控制策略,确保车辆数据的安全性和隐私性。 8. **友好的用户操作界面**:界面直观易用,降低工作人员的学习成本,并提供多语言支持。 9. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据车辆管理业务的发展进行系统升级或功能拓展。 10. **报告生成与数据分析**:提供车辆利用率、费用分析和维保周期等关键指标的报告,帮助管理层做出决策。 通过这些功能,基于Spring Boot的车辆管理系统不仅提升了车辆管理的专业性和准确性,还增强了对车辆使用和维护的监管力度。系统的架构设计注重性能、可用性和可维护性,以支持高并发的数据访问和动态的数据更新。其模块化的设计也便于未来根据车辆管理需求的变化增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
SpringBoot项目基于MVC模式的高校办公室行政事务管理系统是为高等教育机构行政管理部门设计的自动化办公平台。它利用Spring Boot的快速开发特性,结合了文档管理、会议调度、通知发布、员工考勤、资产管理以及报表统计等功能,旨在提供一个高效、系统化且用户友好的工具,以提升行政工作效率和管理水平。 以下是该高校办公室行政事务管理系统的主要功能: 1. **文档与资料管理**:集中存储和管理各类文档资料,支持在线编辑、检索和归档。 2. **会议安排与提醒**:自动安排会议室预定情况,发送会议提醒,并记录会议纪要。 3. **通知公告发布**:一键发布校园通知或公告,确保信息的及时传达和覆盖。 4. **员工考勤管理**:通过签到、请假、外出登记等手段实现员工考勤的自动化管理。 5. **资产登记与追踪**:对办公设备和物资进行编号登记,管理和追踪使用状态和维修记录。 6. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 7. **数据安全与备份**:采取加密技术和定期备份机制,确保数据的安全性和完整性。 8. **友好的用户操作界面**:界面直观易用,降低工作人员的学习成本,并提供多语言支持。 9. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据行政管理需求的变化进行系统升级或功能拓展。 10. **统计分析报告**:提供日常工作统计、资源使用状况和员工绩效等分析报告,辅助管理层优化决策。 通过这些功能,基于Spring Boot的高校办公室行政事务管理系统不仅优化了日常行政流程,提高了工作透明度,还加强了各部门之间的沟通与协作。系统的架构设计注重性能、可用性和可维护性,以支持高并发的数据处理和动态的数据更新。其模块化的设计也便于未来根据高校行政管理的发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
SpringBoot项目海滨体育馆管理系统是一个为海滨城市的体育设施管理单位设计的综合性管理平台。它利用Spring Boot的快速开发特性,结合了预订管理、会员服务、门禁控制、设施维护、收费处理以及数据统计分析等功能,旨在提供一个高效、便捷且用户友好的工具,以改善体育馆的日常运营和提升运动爱好者的体验。 以下是该海滨体育馆管理系统的主要功能: 1. **场地预订与调度**:允许用户在线预订各类体育场馆和设施,同时提供实时的场地使用情况查询。 2. **会员管理**:提供会员注册、续费、积分累积和会员特权管理。 3. **门禁系统整合**:实现与门禁系统的无缝对接,确保进出管理的自动化和安全性。 4. **设施维护跟踪**:记录设施的使用情况和维护历史,定期安排保养工作。 5. **财务与收费管理**:自动化处理门票销售、会员费用和其他相关财务事务。 6. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 7. **数据安全与隐私保护**:采取加密技术和访问控制策略,确保用户信息和交易数据的安全性。 8. **友好的用户操作界面**:界面直观易用,降低工作人员及会员的操作难度,并提供多语言支持。 9. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据体育行业的变化进行系统升级或功能拓展。 10. **数据分析与报表**:通过内置的分析工具生成经营和用户行为的统计报告,辅助决策制定。 通过这些功能,基于Spring Boot的海滨体育馆管理系统不仅提高了体育馆的管理效率和服务品质,还增加了经营透明度和用户满意度。系统的架构设计注重性能、可用性和可维护性,以支持高并发的用户访问和动态的数据更新。其模块化的设计也便于未来根据体育设施运营的需要增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
SpringBoot项目中,我们可以使用@Transactional注解来开启事务。使用@Transactional注解可以将一个方法标记为事务性方法,当该方法被调用时,如果当前存在事务,则在该方法执行过程中,事务会被暂停,方法执行完毕后事务会继续进行。如果当前不存在事务,则会为该方法创建一个新的事务。这样可以确保在方法执行过程中,要么所有的操作都成功提交,要么所有的操作都回滚,从而保证数据的一致性和完整性。 要在SpringBoot项目中使用@Transactional注解,首先需要在配置类(通常是带有@SpringBootApplication注解的类)上添加@EnableTransactionManagement注解,以开启事务管理功能。然后,在需要开启事务的方法上添加@Transactional注解。 例如,在一个Service类的方法上添加@Transactional注解,可以实现对该方法的事务管理: ``` @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void updateUser(String userId, String newUsername) { User user = userRepository.findById(userId); user.setUsername(newUsername); userRepository.save(user); } } ``` 在上述示例中,当updateUser方法被调用时,如果在该方法内部发生异常或者抛出了RuntimeException,事务将会回滚,即数据库中的数据不会被更新。如果方法执行成功,事务将会提交,即数据库中的数据将会被更新。 通过使用@Transactional注解,我们可以方便地在SpringBoot项目实现事务管理,确保数据的一致性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何中应

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

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

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

打赏作者

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

抵扣说明:

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

余额充值