博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot事务以及异常解决
阅读量:3904 次
发布时间:2019-05-23

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

事务是保持数据一致性的,事务包含一个或多个业务操作,这些操作要么都执行,要么都不执行。事务常被用来确保数据的一致性。

  • 事务四大特性:原子性

    原子性是指事物所包含的操作要么全部执行,要么全不执行。所有失败的操作都必须回滚。

  • 一致性

    一致性是说事物从一个一致性结果变化为另一个一致性结果的状态,也就是一个事务执行之前和执行之后都必须处于一致性状态。

  • 隔离性

    隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
      即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  • 持久性

    持续性
    指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
    spring boot是默认启动事务的,只需要在类或者方法上添加@Transactional注解即可,但有时候会发现事务不生效,具体原因可以从以下几个方面找寻:

1、首先要看数据库引擎是否支持注解,mysql默认引擎INNODB是支持的,但MYISAM是不支持的;

2、注解只能被应用到public方法上, 其它方法上不会报错,但不生效;

3、默认情况下只会对运行期异常(java.lang.RuntimeException及其子类)和 Error 进行回滚;

4、如果是其它异常,可以显形标记在参数里,下图标红的就是先进行查看用户有指定的异常,如果没有,就默认上一条的异常,参数格式:@Transactional(rollbackFor={Exception.class})

5、是否进行了异常捕获,如果使用了try–catch,事务是肯定不生效,也就是系统没有接收到异常场景;

关于使用异常捕获,还想事务生效,可以有几种策略解决相关难题:

1)手动回滚,推荐方式
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2)在catch里抛出一个runntimeException

  1. 将异常写入注解参数里面,也需要抛出来,原理跟方法2一样的,只是重新指定了事务回滚的异常类型

扩展----隔离级别

Spring 传播七种行为

Propagation

  • PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常

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

你可能感兴趣的文章
C语言:编写strcpy函数
查看>>
两个整数二进制表达中,有多少个位(bit)不同
查看>>
编写函数返回值value的二进制模式从左到右翻转后的值
查看>>
一组数据中只有一个数字出现一次,其他数成对出现,找出这个数
查看>>
String类的浅拷贝和深拷贝
查看>>
c++单链表【构造函数、运算符重载、析构函数、增删查改等】
查看>>
String深拷贝、比较及增删查改等操作
查看>>
智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
查看>>
【C++】智能指针shared_ptr 定位删除器(仿函数)
查看>>
浅析c++异常
查看>>
判断一个数是否为回文数,字符串是否为回文字符串
查看>>
迷宫问题
查看>>
使用两个栈实现一个队列
查看>>
使用两个队列实现一个栈
查看>>
实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
查看>>
稀疏矩阵的压缩存储和转置
查看>>
堆的实现(堆的建立及push、pop元素)
查看>>
【适配器模式】实现优先级队列
查看>>
堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
查看>>
【海量数据处理】N个数中找出最大的前K个数
查看>>