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 相关文章推荐
MybatisPlus代码生成器的使用方法详解
Jun 13 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
Java基于字符界面的简易收银台
Jun 26 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
java中用float时,数字后面加f,这样是为什么你知道吗
Sep 04 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
Spring Boot 实现 WebSocket
Apr 30 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多线程异步请求的3种方法
2014/01/17 PHP
PHP图片加水印实现方法
2016/05/06 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
常用js脚本
2006/12/03 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
python中np是做什么的
2020/07/21 Python
Python如何输出百分比
2020/07/31 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
班主任经验交流会主持词
2014/04/01 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
工作检讨书大全
2015/01/26 职场文书
单位推荐信范文
2015/03/27 职场文书
亲戚关系证明
2015/06/24 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS