博客
关于我
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实现BinarySearchTreeNode树算法(附完整源码)
    查看>>
    Objective-C实现binarySearch二分查找算法(附完整源码)
    查看>>
    Objective-C实现binomial coefficient二项式系数算法(附完整源码)
    查看>>
    Objective-C实现binomial distribution二项分布算法(附完整源码)
    查看>>
    Objective-C实现bisection二分法算法(附完整源码)
    查看>>
    Objective-C实现bisection二等分算法(附完整源码)
    查看>>
    Objective-C实现BitMap算法(附完整源码)
    查看>>
    Objective-C实现bitmask位掩码算法(附完整源码)
    查看>>
    Objective-C实现bitonic sort双调排序算法(附完整源码)
    查看>>
    Objective-C实现BloomFilter布隆过滤器的算法(附完整源码)
    查看>>
    Objective-C实现BMP图像旋转180度(附完整源码)
    查看>>
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现BP误差逆传播算法(附完整源码)
    查看>>
    Objective-C实现breadth First Search广度优先搜索算法(附完整源码))
    查看>>
    Objective-C实现BreadthFirstSearch广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现BreadthFirstShortestPath广度优先最短路径算法(附完整源码)
    查看>>
    Objective-C实现bubble sort冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现bucket sort桶排序算法(附完整源码)
    查看>>