Spring中@Transactional(rollbackFor=Exception.class)属性用法介绍

序言

今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法;

异常

如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常

error是一定会回滚的

如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

事务管理方式

事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

spring支持编程式事务管理和声明式事务管理两种方式。

  • 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
  • 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
  • 声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

使用说明

当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚

@Transactional注解的全部属性详解

@Transactional属性

属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

到此这篇关于Spring中@Transactional(rollbackFor=Exception.class)属性用法介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Spring中的事务@Transactional细节与易错点、幻读

    目录 为什么要使用事务? 如何使用事务? 事务的传播带来的几种结果 两个特例 事务传播属性propagation 数据库隔离级别 1.未提交读(会有脏读的现象) 2.已提交读 3.可重复读 (有可能覆盖掉其他事务的操作) 4.串行化(没有并发操作) Spring事务隔离级别比数据库事务隔离级别多一个default ACID,事务内的一组操作具有 原子性 .一致性.隔离性.持久性. Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束

  • Spring事务处理Transactional,锁同步和并发线程

    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 . 未授权读取(Read Uncommitted): 也称 未提交读.允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据.该隔离级别可以通过 "排他写锁"实现.事务隔离的最低级别,仅可保证不读取物理损坏的数据.与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据. 授权读取

  • spring声明式事务 @Transactional 不回滚的多种情况以及解决方案

    目录 一. spring 事务原理 问题一.@Transactional 应该加到什么地方,如果加到Controller会回滚吗? 问题二. @Transactional 注解中用不用加rollbackFor = Exception.class 这个属性值 问题三:事务调用嵌套问题具体结果如下代码: 四.总结 五. 参考链接 本文是基于springboot完成测试测试代码地址如下: https://github.com/Dr-Water/springboot-action/tree/master

  • 使用@TransactionalEventListener监听事务教程

    目录 @TransactionalEventListener监听事务 最近在项目遇到一个问题 解决办法:@TransactionalEventListener 拓展 注解@TransactionalEventListener 监听的对象 监听到之后的操作 @TransactionalEventListener监听事务 项目背景 最近在项目遇到一个问题 A方法体内有 INSERT.UPDATE或者DELETE操作,最后会发送一段MQ给外部,外部接收到MQ后会再发送一段请求过来,系统收到请求后会执行

  • @Transactional注解不起作用的原因分析及解决

    目录 Transactional失效场景介绍 第一种 第二种 第三种 @Transactional注解不起作用原理分析 第一种 不创建代理对象 不进行代理调用 第二种 第三种 Transactional失效场景介绍 第一种 Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用.例如以下代码. 定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法 /** * @author zhoujy * @date 2018年12

  • 解析spring事务管理@Transactional为什么要添加rollbackFor=Exception.class

    spring中事务处理原理 利用aop生成代理对象执行带有Transactional事务注解的方法业务逻辑.项目启动过程中会生成代理对象并将Transactional注解中的属性进行解析加载处理.在方法执行过程中如果出现异常,会根据注解配置决定是进入到事务回滚处理还是事务提交处理逻辑中,事务回滚处理逻辑中最终还是基于数据库的事务回滚处理. 异常的分类 案例说明 以自定义异常为例说明一下@Transactional中是否指定rollbackFor=Exception.class的区别     未指

  • Spring中@Transactional(rollbackFor=Exception.class)属性用法介绍

    序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止. 如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出.队列里面出现异常数据了,正常的处理应

  • Spring中@Transactional用法详细介绍

    Spring中@Transactional用法详细介绍 引言: 在spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项的使用. 1.  @Transactional的定义 Spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题.在现实中,实际的问题往往比我们预期的要复杂很多,这就要求对@Tr

  • Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)

    让我们来看一个例子: import numpy as np x=np.array([[1,2,3],[5,6,7],[7,8,9]]) print(x) Out[64]: array([[1, 2, 3], [5, 6, 7], [7, 8, 9]]) 以上的结果我想大家应该没问题把,就是定义了一个np数组,关键在下面 print(x[:,::-1]) Out[65]: [[3 2 1] [7 6 5] [9 8 7]] 以上的代码实现了一种功能,就是将数组倒序排列了,每个维度上倒序,这段代码怎

  • 浅谈Spring中@Transactional事务回滚及示例(附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.checked异常和unc

  • Android TextView中文字通过SpannableString设置属性用法示例

    本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法.分享给大家供大家参考,具体如下: 在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. //创建一个 SpannableString对象 SpannableStri

  • Java中GUI工具包AWT和Swing用法介绍

    java 中编写 GUI 有两中工具包,分别为 AWT.Swing. Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和方法. AWT 和 Swing 都能跨平台使用:AWT 会随着不同的系统平台,UI 样式会有所变化,Swing 则不会,设计完毕后在所有平台下样式一致. import java.awt.*; import javax.swing.*; 一个 awt 示例 下面是一个窗口示例 import java.awt.*; public class MyFrame e

  • mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有

  • 在Spring中自动装配Bean的属性

    Spring的最基本的能力就是DI,即依赖注入,或控制反转,它可以为Bean注入其依赖的其他Bean. 一个Bean依赖其他Bean一般是通过在Bean中定义其他Bean的成员变量的方式来实现的,那么,Spring的DI也就表现为给Bean的属性自动注入值. 这一般分为以下其中情况. 1,自动注入基本类型. 自动注入基本类型,即当一个Bean有一些基本类型的属性时,例如String,double,int等类型的属性时,我们可以在xml中自动为这些属性注入值.虽然这也成为自动注入的一种,但严格来讲

  • 详解iOS中UIButton的三大UIEdgeInsets属性用法

    UIEdgeInsets是什么 UIEdgeInsets是什么?我们点进去看一下: typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset' } UIEdgeInsets; UIEdgeInsets是个结构体类型.里面有四个参数,分别是:

  • Vue.js中v-show和v-if指令的用法介绍

    目录 一.v-show指令 二.v-if指令 三.v-show和v-if的区别 四.v-else指令 五.v-else-if 一.v-show指令 v-show指令可以用来动态的控制DOM元素的显示或隐藏.v-show后面跟的是判断条件,语法如下: v-show="判断变量" 例如: v-show="true",表示显示DOM元素. v-show="false", 表示隐藏DOM元素. 看下面的示例: <!DOCTYPE html>

随机推荐