声明式事务和编程式事务_声明式事务管理还是编程式事务管理-程序员宅基地

技术标签: Spring  

事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性。
spring支持编程式事务管理和声明式事务管理两种方式。

编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
spring事务特性

spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口

其中TransactionDefinition接口定义以下特性:
事务隔离级别
隔离级别是指若干个并发的事务之间的隔离程度。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。
事务超时
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
事务只读属性

只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。
默认为读写事务。

“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。
但是你非要在“只读事务”里面修改数据,也并非不可以,只不过对于数据一致性的保护不像“读写事务”那样保险而已。
因此,“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可

spring事务回滚规则

指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Maxiao1204/article/details/81089451

智能推荐

关于普元学习最初遇到的问题_has illegal literal-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏8次。一些使用普元的总结,持续更新。。。1、 EOS是自带容器,自带IDE的闭源开发平台;2、 直接启动容器,可直接进入容器后台进行数据库的设置(解决新环境启动数据库连接超时问题)URL:http://127.0.0.1:8080/governor/governor/frame/com.primeton.governor.user.Index.flow截图:选中后点击“修改”,将数据库的连接修改为正..._has illegal literal

python 转盘 圆形,用python实现一个转盘-程序员宅基地

文章浏览阅读579次。用python实现一个转盘发布时间:2019-09-22 08:09:12编辑:auto阅读(624)#抽奖 面向对象版本import tkinterimport timeimport threadingclass choujiang:#初始化魔术方法def __init__(self):#准备好界面self.root = tkinter.Tk()self.root.title('lowB版转盘..._越转越快的圆形python代码

Kali系统上安装配置GVM(OpenVAS)V21.4_找不到命令 “gvm-setpu”,您的意思是: “gvm-setup” 命令来自 debian 软-程序员宅基地

文章浏览阅读2k次。一、kali-linux系统准备工作: 1、kali 系统下载地址【https://www.kali.org/get-kali/】,我直接选择VMware虚拟机。2、kali系统更新: a、更改下更新源为阿里、清华等源地址:vim /etc/apt/source.list 文本内容如下:#aliyun 阿里云deb http://mirrors.aliyun.com/kali kali-rolling main non-f..._找不到命令 “gvm-setpu”,您的意思是: “gvm-setup” 命令来自 debian 软件包 gv

【花雕动手做】ASRPRO-Plus语音识别(03)---板载硬件模块和12项综合应用功能_asrpro语音模块-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏4次。2、离线语音识别模块:搭载ASRPRO核心板,内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测等功能。4、更新和维护:随着技术的不断发展和用户需求的变化,可能需要更新屏幕固件或更换更先进的屏幕,开发者应定期检查更新并采取必要的维护措施,以确保设备的正常运行和使用效果。1、语音增强:ASRPRO-Plus采用一系列先进的数字信号处理技术,对输入的语音信号进行降噪、回声消除、增益控制等处理,以提高语音信号的清晰度和可懂度。_asrpro语音模块

QT radioButton_qt ui界面buttongroup-程序员宅基地

文章浏览阅读332次。【代码】QT radioButton。_qt ui界面buttongroup

wsl2 kali 安装报错 WslRegisterDistribution failed with error: 0x80004005-程序员宅基地

文章浏览阅读5.5k次,点赞13次,收藏13次。修改注册表解决 wsl2 kali 安装报错 0x80004005_wslregisterdistribution failed with error: 0x80004005

随便推点

探索GitHub CSV工具:高效数据处理的新选择-程序员宅基地

文章浏览阅读901次,点赞12次,收藏17次。探索GitHub CSV工具:高效数据处理的新选择项目地址:https://gitcode.com/gavinr/github-csv-tools项目简介在大数据时代,CSV文件作为通用的数据交换格式,始终扮演着重要角色。GitHub CSV Tools 是一个专为开发者和数据分析师打造的轻量级命令行工具集,它旨在简化CSV文件的读取、解析、过滤、转换及合并等任务。该项目完全开源,并提供易...

Unity开发移动端相机的优缺点分析_unity 相机多了会有坏处吗-程序员宅基地

文章浏览阅读7.2k次。它对相机硬件不是太“了解” 用它的API,3000块钱的手机和500块钱的手机的拍照效果相差不大。造成这种差异的原因是,unity的相机方面的API,他没有获取相机参数的方式,对于相机的硬件设备,它只是单方面的要求,没有互动,它的模式是,我需要什么样的图片,那么我就要求相机返回什么样的图片给我,而不关心它是否真的能有能力返回给我。通俗的讲就是,在它看来,哈士奇和泰迪都是狗,它们没有任何区别。_unity 相机多了会有坏处吗

快速集成iOS基于RTMP的视频推流-程序员宅基地

文章浏览阅读56次。来源:Monkey_ALin链接:http://www.jianshu.com/p/8ea016b2720e效果图iTools有点卡, 但是推到服务器倒是很快的.推流前言这篇blog是iOS视频直播初窥:的一个补充. 因为之前传到github上的项目中没有集成视频的推流.有很多朋友简信和微博上问我..._ios rtmp 推流demo

Flutter组件--Slivers的基本使用_sliverfixedextentlist-程序员宅基地

文章浏览阅读839次。我们考虑一个这样的布局:一个滑动的视图中包括一个标题视图(HeaderView),一个列表视图(ListView),一个网格视图(GridView)。我们怎么可以让它们做到统一的滑动效果呢?使用前面的滚动是很难做到的。Flutter中有一个可以完成这样滚动效果的Widget:CustomScrollView,可以统一管理多个滚动视图。在CustomScrollView中,每一个独立的,可滚动的Widget被称之为Sliver。_sliverfixedextentlist

View 事件传递,分发与拦截_view 事件包含阻止传递-程序员宅基地

文章浏览阅读336次。目录[-]1、基础知识2、传递流程1、基础知识(1) 所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。(2) 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POI_view 事件包含阻止传递

[爬虫]爬取搜狗的词库-程序员宅基地

文章浏览阅读277次。同学要做用户搜索词意图分析,要用到分词,让我给写一个爬虫爬取搜狗词库的脚本。以前爬取网页都使用正则匹配,想要用美丽的汤很久了,正好借此机会体验一下它的强大威力。脚本对搜狗词库主页进行一级爬取结果,然后对每一个分类进行二级页面爬取,然后获取该分类下的词库文件,保存到执行脚本同目录的1文件夹下。python还是新手一个,要是对有帮助的同学尽管拿去。#coding=utf-8'''Created..._c# 爬取搜狗词库