Spring中的@Transactional的工作原理


Posted in Java/Android onJune 05, 2022

1、原理

事务的概念想必大家都很清楚,其ACID特性在开发过程中占有重要的地位。同时在并发过程中会出现一些一致性问题,为了解决一致性问题,也出现了四种隔离级别,这里就不再详述了,感兴趣的可以去查一下。下面我们讨论一下Spring中的事务。

Spring中的事务有两种:

  • 编程式事务
  • 声明式事务

通常情况下我们使用声明式事务,它是基于SpringAOP实现的。基于AOP实现的事务极大得帮助了我们的开发效率,其本质是对方法进行前后拦截,在目标方法前加入一个事务,在目标完成后再加入一个事务进行提交或者回滚,这种方式下我们并不需要在目标方法中的代码中掺杂事务管理代码,轻松进行事务管理。

而编程式事务就需要我们修改代码来进行事务管理。这种方法看似很麻烦,但是它的存在自有它的道理,上面我们讲到的声明式事务控制,其控制的细粒度只能作用到方法上,无法在代码块中实现声明式事务控制。我们都知道,一旦加上事务,程序的运行效率就会降低,所以编程式事务也有它的用武之地。

但是我们的广大劳动人民也是智慧的。直接将需要事务的代码块独立成方法,这样仍然可以使用声明式事务。当然在开发中具体情况要具体分析了。

2、用法

事务的传播行为: 

Spring中的@Transactional的工作原理

 事务的隔离级别

Spring中的@Transactional的工作原理

@Transactional属性

Spring中的@Transactional的工作原理

 示例代码:

@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public List<Role> findAllRoles() {
        return roleDao.selectAllRoles();
    }
}

3、拓展

1、为什么声明式事务只能应用于方法上?

  • 因为声明式事务是基于AOP实现的,AOP是基于动态代理实现的。
  • 动态代理只会捕捉来自外部的方法调用,
  • 意思就是类内部的方法调用类内部的另外方法,并不会发生事务行为。

到此这篇关于Spring中的@Transactional的工作原理的文章就介绍到这了,更多相关Spring @Transactional 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
解析Java异步之call future
Jun 14 Java/Android
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
关于Mybatis中SQL节点的深入解析
Mar 19 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
Qt数据库应用之实现图片转pdf
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 #Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
Jun 01 #Java/Android
Java中生成微信小程序太阳码的实现方案
Jun 01 #Java/Android
Java处理延时任务的常用几种解决方案
Java实现添加条码或二维码到Word文档
Jun 01 #Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 #Java/Android
You might like
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Python简单计算文件夹大小的方法
2015/07/14 Python
详解Python编程中包的概念与管理
2015/10/16 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
python实现取余操作的简单实例
2020/08/16 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
本科生职业生涯规划书范文
2014/01/21 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
大国崛起英国观后感
2015/06/02 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
golang内置函数len的小技巧
2021/07/25 Golang