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 相关文章推荐
Java基础之this关键字的使用
Jun 30 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
详解Flutter和Dart取消Future的三种方法
Apr 07 Java/Android
Java数据结构之堆(优先队列)
May 20 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
JS前端广告拦截实现原理解析
2020/02/17 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Python实现像awk一样分割字符串
2020/09/15 Python
python实现三壶谜题的示例详解
2020/11/02 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
美国温暖商店:The Warming Store
2018/12/15 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
计算机大学生的自我评价
2013/10/15 职场文书
韩国商务邀请函
2014/01/14 职场文书
公司承诺书格式
2014/05/21 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
技术入股协议书
2016/03/22 职场文书
python实现双向链表原理
2022/05/25 Python