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 @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
Java使用jmeter进行压力测试
Jul 09 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
idea以任意顺序debug多线程程序的具体用法
Aug 30 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Java数据结构之堆(优先队列)
May 20 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 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 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
PHP处理会话函数大总结
2015/08/05 PHP
表单内同名元素的控制
2006/11/22 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
Python中的pass语句使用方法讲解
2015/05/14 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
Delphi CS笔试题
2014/01/04 面试题
应聘收银员个人的求职信
2013/11/30 职场文书
求职个人评价范文
2014/04/09 职场文书
主题实践活动总结
2014/05/08 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
施工安全生产承诺书
2014/05/23 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
SpringBoot快速入门详解
2021/07/21 Java/Android
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers