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中的OPTIONAL
Jun 14 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 Java/Android
Java Spring Boot请求方式与请求映射过程分析
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
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
php实现数字补零的方法总结
2018/09/12 PHP
通过javascript把图片转化为字符画
2013/10/24 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python遍历小写英文字母的方法
2019/01/02 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
python实现斗地主分牌洗牌
2020/06/22 Python
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
八一建军节感言
2014/02/28 职场文书
考核工作实施方案
2014/03/30 职场文书
秋天的图画教学反思
2014/05/01 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
文明单位申报材料
2014/12/23 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
php解析非标准json、非规范json的方式实例
2022/05/10 PHP