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 相关文章推荐
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Java基础——Map集合
Apr 01 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
IDEA 2022 Translation 未知错误 翻译文档失败
Apr 24 Java/Android
Java对文件的读写操作方法
Apr 29 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 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
WordPress判断用户是否登录的代码
2011/03/17 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
Python heapq使用详解及实例代码
2017/01/25 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
PyTorch中permute的用法详解
2019/12/30 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
父亲生日宴会答谢词
2014/01/10 职场文书
服务生自我鉴定
2014/01/22 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
事业单位考核材料
2014/05/21 职场文书
公司联欢会主持词
2015/07/04 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
防止web项目中的SQL注入
2021/12/06 MySQL