博客
关于我
Spring Transactional 事务使用与回滚策略
阅读量:563 次
发布时间:2019-03-09

本文共 2472 字,大约阅读时间需要 8 分钟。

')"'deployment和spring的事务管理是spring框架中非常重要的机制之一。在本节中,我们不仅将展示事务在何种情况下会自动回滚,还将探讨如何对事务进行友好的处理,让我们的应用在遇到问题时能够更加优雅地处理。

'事务在spring中默认是如何工作的?'

在我们上节中,已经对@Transactional注解做了详细说明。如果你还没有看过,可以跳过来看看。简单来说,spring的事务管理是一种轻量的事务管理方案,默认情况下它会在我们的方法调用中创建一个事务,这个事务会在正常的情况下提交,而在出现错误时自动回滚。

'让我们来看看一个简单的例子'

下面是一个简单的保存逻辑:

@Transactionalpublic void save() {    Demo demo = Demo.builder()        .id(uid())        .name("javayh")        .adder("beijing")        .build();    demoDao.save(demo);}

当我们启动项目并调用这个接口时,我们可以看到以下几点:

  • spring会为我们创建一个默认的事务,配置和设置是通过factories来完成的
  • Whoever认为事务已经关闭请参考前面的现象介绍
  • 在数据库上执行操作,这段代码正常运行,没有任何异常抛出
  • 最后,我们会进行事务提交和关闭
  • '当我们对代码进行修改后会发生什么?'

    如果我们在保存逻辑中添加以下代码:

    @Transactionalpublic void save() {    Demo demo = Demo.builder()        .id(uid())        .name("javayh")        .adder("beijing")        .build();    demoDao.save(demo);    Integer.valueOf(demo.getAdder());}

    当我们调用接口时会遇到以下情况:

  • 在日志中发现事务已经进行了回滚
  • 是不是很友好?选项似乎不太对
  • 但是这证明我们的事务是有效的,只是这种处理方式对于开发者来说并不友好
  • '改进后的友好处理方式'

    为了让我们的代码更加友好,我们可以在try-catch语句中进行处理:

    @Transactionalpublic Boolean save() {    Boolean flag = true;    try {        Demo demo = Demo.builder()            .id(uid())            .name("javayh")            .adder("beijing")            .build();        demoDao.save(demo);        Integer.valueOf(demo.getAdder());    } catch (RuntimeException e) {        e.printStackTrace();        flag = false;        throw new RuntimeException();    }    return flag;}

    我们发现通过抛出异常来处理事务问题,虽然对于客户端来说仍然不友好,但对于开发者和服务器来说,这是更容易处理的事务状态。

    '手动设置事务回滚'

    但我们还可以采取另一种方法:手动设置事务回滚而不抛出异常。这样可以让我们的调用接口更加友好:

    @Transactionalpublic Boolean save() {    Boolean flag = true;    try {        Demo demo = Demo.builder()            .id(uid())            .name("javayh")            .adder("beijing")            .build();        demoDao.save(demo);        Integer.valueOf(demo.getAdder());    } catch (RuntimeException e) {        e.printStackTrace();        flag = false;        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();        // 或者继续抛出异常        throw new RuntimeException();    }    return flag;}

    通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()我们可以手动设置事务为回滚状态,这种方法既保证了事务的正确性,又让我们的接口友好地返回状态,而不是突然报错。

    '为什么这两种方式都有不同效果呢?''

    其实两种方式都能达到事务回滚的效果,但效果有点不同:

  • 抛出异常会让spring的事务管理器自然地检测到异常并回滚事务,这种方式更直观
  • 手动设置事务回滚的方式则是让开发者有更大的控制权,可以在有需要的时候灵活处理
  • '事务管理是很多开发者在日常工作中需要理解的核心概念之一'

    事务的使用和处理可能看起来有点复杂,但只要理解了spring的事务管理机制和如何处理事务异常,就能更好地控制我们的应用程序的状态。这也是我们在编写高质量的代码时需要掌握的一点技能。'

    通过这个课程,我们不仅学会了怎么配置事务,还学会了如何在应用遇到问题时优雅地处理事务,确保我们的系统在错误处理时依然可以保持良好的用户体验。

    转载地址:http://undpz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>
    Objective-C实现AvlTree树算法(附完整源码)
    查看>>
    Objective-C实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
    查看>>
    Objective-C实现BACKTRACKING 方法查找集合的幂集算法(附完整源码)
    查看>>
    Objective-C实现bailey borwein plouffe算法(附完整源码)
    查看>>
    Objective-C实现balanced parentheses平衡括号表达式算法(附完整源码)
    查看>>
    Objective-C实现base64加密和base64解密算法(附完整源码)
    查看>>
    Objective-C实现base64加解密(附完整源码)
    查看>>
    Objective-C实现base64编码 (附完整源码)
    查看>>
    Objective-C实现base85 编码算法(附完整源码)
    查看>>
    Objective-C实现basic graphs基本图算法(附完整源码)
    查看>>
    Objective-C实现BCC校验计算(附完整源码)
    查看>>
    Objective-C实现bead sort珠排序算法(附完整源码)
    查看>>
    Objective-C实现BeadSort珠排序算法(附完整源码)
    查看>>
    Objective-C实现bellman ford贝尔曼福特算法(附完整源码)
    查看>>
    Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现bellmanFord贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现BellmanFord贝尔曼-福特算法(附完整源码)
    查看>>