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 相关文章推荐
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
java中重写父类方法加不加@Override详解
Jun 21 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
Java基于Dijkstra算法实现校园导游程序
Mar 17 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
springboot读取resources下文件的方式详解
Jun 21 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 Document 代码注释规范
2009/04/13 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
php事务处理实例详解
2014/07/11 PHP
php数组使用规则分析
2015/02/27 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
2009/08/04 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
python输出指定月份日历的方法
2015/04/23 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
详解Scrapy Redis入门实战
2020/11/18 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
保护环境倡议书500字
2014/05/19 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
大二学生自我检讨书
2014/10/23 职场文书
培训通知书模板
2015/04/17 职场文书