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 相关文章推荐
详解Spring事件发布与监听机制
Jun 30 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
SpringBoot快速入门详解
Jul 21 Java/Android
spring boot中nativeQuery的用法
Jul 26 Java/Android
详解Java七大阻塞队列之SynchronousQueue
Sep 04 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
java开发双人五子棋游戏
May 06 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
Jul 23 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
文件上传类
2006/10/09 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
解析js如何获取css样式
2016/12/11 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python配置grpc环境
2019/01/01 Python
Python 一句话生成字母表的方法
2019/01/02 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
便利店促销方案
2014/02/20 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
面试感谢信范文
2015/01/22 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android