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 相关文章推荐
解决Maven项目中 Invalid bound statement 无效的绑定问题
Jun 15 Java/Android
Java并发编程之Executor接口的使用
Jun 21 Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 Java/Android
一篇文章带你复习java知识点
Jun 28 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java 超详细讲解十大排序算法面试无忧
Apr 08 Java/Android
一文搞懂Java中的注解和反射
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
discuz安全提问算法
2007/06/06 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
详解VUE前端按钮权限控制
2019/04/26 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python3.5使用tkinter制作记事本
2016/06/20 Python
Python assert语句的简单使用示例
2019/07/28 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
《颐和园》教学反思
2014/02/26 职场文书
社团活动总结报告
2014/06/27 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
餐厅开业活动方案
2019/07/08 职场文书
导游词之清晏园
2019/11/22 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
Python提取PDF指定内容并生成新文件
2021/06/09 Python