SpringBoot事务详解

SpringBoot事务详解一、定义  事务(transaction)是指业务逻辑上对数据库进行的一系列持久化操作,要么全部成功,要么全部失败。二、特性和实现  1、事务的四个基本性质(ACID)  1)原子性(Atomicity)     事务的原子性指事务是一个不可分割的工作单位,这组操作要么全部执行,要么全部不发生。     就拿银行转账来说,原子性指的是从A账户…

大家好,又见面了,我是你们的朋友全栈君。

一、定义

    事务(transaction)是指业务逻辑上对数据库进行的一系列持久化操作,要么全部成功,要么全部失败。

二、特性和实现

    1、事务的四个基本性质(ACID)

    1)原子性(Atomicity)

          事务的原子性指事务是一个不可分割的工作单位,这组操作要么全部执行,要么全部不发生。

          就拿银行转账来说,原子性指的是从A账户扣款和转账到B账户两件事一起发生,不能只发生其中一样。

    2)一致性(Consistency)

          在事务开始的前后,被操作的数据的完整性都处于一致性的状态。

          还是银行转账的例子,一致性指的是在转账的前后A和B两个账户的总金额是不变的,始终保持一致。

    3)隔离性(Isolation)

          多个事务并发时,事务之间是隔离的,每个事务都有自己的完整数据空间,不会影响到其他事物的运行效果。

          事务隔离性的四种隔离级别和实现原理这里就不作阐述,感兴趣的可以看以下两篇博客:

                四种隔离级别      https://blog.csdn.net/qq_33290787/article/details/51924963

                实现原理            https://blog.csdn.net/matt8/article/details/53096405

    4)持久性(Durability)

          事务提交后,该事务对数据所做的修改将持久地保存在数据库,并不会回滚。

    事务的原子性、一致性和持久性是通过数据库的redo/undo日志文件实现的。redo log处理系统故障,undo log处理事务回滚。如果在事务提交之后出现数据库崩溃(断电)的情况,在恢复供电时,数据库会根据重写日志对数据进行前滚。

    2、事务的实现

    在Spring中,事务有两种实现方式,分别是编程式事务和声明式事务。

    编程式事务:编程式事务管理使用Transaction Template或者直接使用底层的Platform TransactionManager。对于编程式事务,Spring推荐使用Transaction Template。TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    声明式事务:声明式事务基于AOP,其本质是对方法前后进行拦截,在方法开始前创建或加入一个事务,再根据目标方法执行的结果决定提交还是回滚事务。只需要在类、方法加上@Transactional注解就可以使用事务,没有入侵性,简单粗暴。

三、声明式事务的使用技巧

    1、@Transactional可以作用于接口、接口方法、类、类方法上,当作用到类时,该类下所有public方法都将具有该类型的事务属性,同时,也可以在方法级别使用该注解来覆盖类级别的定义。Spring的建议是在具体的实现类和类方法使用@Transactional注解,而不是使用在接口上。因为注解不能继承,不能被基于接口的代理类所识别,注解失效。

    2、声明式事务管理默认只对非检查型异常unchecked Exception进行回滚,也就是对RuntimeException异常以及它的子类进行回滚操作。

SpringBoot事务详解

    如果需要让checked Exception也进行回滚,需加上@Transactional(rollbackFor=Exception.class)、

    如果需要让unchecked Exception不进行回滚,需加上@Transactional(notRollbackFor=Exception.class)

    3、在Springboot使用声明式事务需要在Application启动类加入@EnableTransactionManagement注解,相当于Spring的自动扫描

 

四、声明式事务的常用配置

参 数 名 称 功 能 描 述
readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时

 

五、声明式事务的隔离级别

隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:

TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。 
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。 
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。 
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。 
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

 

六、声明式事务的传播行为

所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。 
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。 
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。 
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。 
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

 

参考博客:

 

SpringBoot事务注解@Transactional    https://blog.csdn.net/wkl305268748/article/details/77619367

事务的四大特征      https://blog.csdn.net/longxingzhiwen/article/details/53912475

理解事务的四种隔离级别     https://blog.csdn.net/qq_33290787/article/details/51924963 

@Transactional(rollbackFor=Exception.class)的使用  https://blog.csdn.net/Mint6/article/details/78363761

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131191.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 爬取爱套图网上的图片

    爬取爱套图网上的图片#coding=utf-8frombs4importBeautifulSoupimportrequestsforiinrange(20):i=str(i)url=’https://www.aitaotu.com/weimei/16359_’+i+’.html’html=requests.g…

  • 电脑对于目标文件系统过大_提示文件过大

    电脑对于目标文件系统过大_提示文件过大Win10系统提示对于目标文件系统过大今天在复制MAC系统文件时,系统弹出窗口提示“对于目标文件系统,文件XXX过大”。出现这种情况的原因是FAT32的文件系统不支持复制大于4g的单个文件,而NTF

  • iocp详解_iocp是异步io吗

    iocp详解_iocp是异步io吗#include”SOCKET.h”#includeDWORDWINAPIThreadProc(LPVOIDpvParam);#definePORT8080#defineLISTEN_QUEUE200//AcceptEx和GetAcceptExSockaddrs的函数指针,用于调用这两个扩展函数LPFN_ACCEPTEX       

  • 深度学习 相机标定_相机标定

    深度学习 相机标定_相机标定术语内参矩阵:IntrinsicMatrix焦距:FocalLength主点:PrincipalPoint径向畸变:RadialDistortion切向畸变:TangentialDistortion旋转矩阵:RotationMatrices平移向量:TranslationVectors平均重投影误差:MeanReprojectionError重投影误差:Repr…

  • OpenCV—Python 分水岭算法图像分割「建议收藏」

    OpenCV—Python 分水岭算法图像分割「建议收藏」文章目录一、前言二、cv2.distanceTransform(src,distanceType,maskSize)三、基于标记的分水岭分割功能四、示例代码一、前言分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。其他图像分割方法,如阈…

  • Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决[通俗易懂]

    Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决[通俗易懂]目录1、VMware安装Ubuntu16.4虚拟机1.1、下载Ubuntu镜像文件1.2、安装Ubuntu虚拟机1.2、装Ubuntu系统和虚拟机工具1.3、解决Ubuntu不能全屏显示1.4、设置共享文件夹1.4.1、主机上的文件夹设置1.4.2、虚拟机上的设置1.5、解决/mnt下没有hgfs文件夹1.6、解决找不到共享文件夹的问题1.7、解决重启后共享文件夹没有了的问题2、Ubuntu安装Python3.92.1、安装Python3.92.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号