学习Spring之声明式事务

news2024/9/30 5:31:05
  • 什么是事务?

一个业务有一组操作,要么都成功,要么都失败

  • 事务的四大特性:ACID

A 原子性:一组操作,要么都成功,要么都失败

C 一致性 :事务的前后要保证事务的一致性

I 隔离性 :很重要,两个事务之间的数据不能被相互影响

D 持久性

  • 什么是声明式事务?

事务分两类:

编程式事务:就像我们之前写的JDBC的编写事务的方法

connection.setAutoCommit(true);

connection.beginTransaction();

connection.commit();

connection.rollback();

以上是编程式事务

我们今天学的就是声明式的事务,基于AOP的方式

事务管理器:

Understanding the Spring Framework Transaction Abstraction :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/6.1-SNAPSHOT/data-access/transaction/strategies.html

无论是JDBC还是Mybatis还是Hibernate都需要一个事务管理器,事务管理器最终还是针对Connection进行事务 管理,所以要把数据源交给事务管理器

之后添加事务的驱动

<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--开启注解的方式的事务,开启事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

事务的实现原理?

事务底层是用AOP实现的,加上@Transactional注解之后,会依据动态代理创建一个子类,进而会将这个方法作为切入点,切面就是之前编程式事务的内容,在要执行的方法前后加上事务的逻辑commit和rollback,涉及到了跨方法,将conn放入ThreadLocal中

  • 使用@Transactional注解

可以标记在方法上,也可以标记在类上面(写在方法上事务控制逻辑粒度更细)

一般@Transactional写在业务逻辑方法上面,

@Transactional(isolation =xxx ,propagation = xxx)

事务注解中有两个属性:重要

@Transactional(isolation = Isolation.REPEATABLE_READ )

  1. isolation :隔离级别

a 读未提交:read uncommitted 事务1读到了事务2的未提交的数据,如果事务2将这个操作做回滚了,那么事务1读到的就是脏数据

b 读已提交:read committed 事务1在没有提交之前读到了事务2已经提交的数据,造成了这个事务1还没有结束,两次读取的结果不一样,进而形成了不可重复读的问题

c 可重复读 repeatable read (其实是上了一个行锁)事务1开始了还没结束 ,读取表数据,这时候事务2修改了表数据并且已经提交,那么事务1在这个事务中是查不到修改的数据的,但是事务1能查询到事务2已经提交的增加的数据,这就是幻影读。

d 事务串行化 表锁 最安全,性能也最差

在mysql中查看事务的隔离级别:SELECT @@transaction_isolation;

对应的结果:REPEATABLE-READ(Mysql的默认级别是可重复读)

设置本次会话的事务隔离级别,四种:

//设置read uncommitted级别:
set session transaction isolation level read uncommitted;

//设置read committed级别:
set session transaction isolation level read committed;

//设置repeatable read级别:
set session transaction isolation level repeatable read;

//设置serializable级别:
set session transaction isolation level serializable;

isolation\出现的问题

脏读(结果覆盖)

不可重复读

幻读

读未提交

出现

出现

出现

读已提交

不出现

出现

出现

可重复读

不出现

不出现

出现

事务串行化

不出现

不出现

不出现

   2.propagation:传播属性

一般是在Service业务逻辑方法中,一个含有事务的方法调用了另外一个含有事务的方法时候会出现事务的传播

REQUIRED,SUPPORTS和REQUIRES_NEW这3中是比较常用的,是重点

注意:当有挂起外部事务的情况的时候,调用方法和被调用的方法不能在一个类中

propagation

外部方法不存在事务

外部方法存在事务

对应注解

REQUIRED

开启新的事务

融入到外部事务

@Transactional(propagation = Propagation.REQUIRED)

适合增删改查

SUPPORTS

不开启新的事务

融入到外部事务

@Transactional(propagation = Propagation.SUPPORTS)

适合查询方法

REQUIRES_NEW

开启新的事务

挂起外部事务

@Transactional(propagation = Propagation.REQUIRES_NEW)

适合业务方法中的业务和外部的方法中的业务关联不大的情况,比如日志

NOT_SUPPORTED

不开启新的事务

挂起外部事务

@Transactional(propagation = Propagation.NOT_SUPPORTED)

就是这么酷,不想自己有事务,外部有事务也别影响我

NEVER

不开启新的事务

抛出异常

@Transactional(propagation = Propagation.NEVER)

就是别想有事务

MANDATORY

抛出异常

融合到外部事务

@Transactional(propagation = Propagation.MANDATORY)

任性,我就是要事务

3.@Transactional(timeout = 2)超时时长,单位是秒

  • 开启事务
  • spring中开启事务:
<!--事务管理器--> 
<bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
</bean> 
<!--开启基于注解的方式的事务,开启事务的注解驱动 粒度更细--> 
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 
// 或者 <!--开启基于注解的方式的事务,开启事务的注解驱动 一劳永逸的方式--> 
<aop:config> 
     <aop:pointcut id="transactionCut" 
           expression="execution(* cn.tulingxueyuan.service.impl.*.*(..))"/> 
     </aop:config> 
<tx:advice> 
    <tx:attributes> 
    <tx:method name="add*"/> <tx:method name="delete*"/> 
    <tx:method name="update*"/> 
    <tx:method name="query*" propagation="SUPPORTS"/> 
    </tx:attributes> 
</tx:advice> 
//以上二选一即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QLabel的使用

QLabel介绍 QLabel 是 Qt 框架中的一个控件类&#xff0c;用于显示文本或图像。它可以在窗口或其他容器中显示静态文本&#xff0c;并且可以根据需要设置格式、对齐方式和尺寸。 主要作用如下&#xff1a; 显示文本内容&#xff1a;QLabel 可以显示文字内容&#xff0c;可以…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Spring Boot 中使用 @EventListener 注解监听事件

Spring Boot 中使用 EventListener 注解监听事件 Spring Boot 是一个流行的 Java Web 框架&#xff0c;它提供了丰富的功能和工具来简化开发人员的工作。其中一个非常有用的功能是事件监听器。在 Spring Boot 中&#xff0c;我们可以使用 EventListener 注解来监听事件&#x…

一天时间完成Python入坑(开发环境搭建、excel解析、exe打包三步走)

0.为什么要入坑Python 早就知道Python好&#xff0c;Python妙&#xff0c;Python用起来呱呱叫。工作上一直没有什么用得上Python的必要性&#xff0c;就一直没有接触&#xff0c;本次终于来了机会&#xff1a;【图新地球桌面端要对外开放Python API】&#xff0c;开放图新地球的…

【mars3d】Cesium实现雷达放射波

Cesium实现雷达放射波 1、雷达放射波 先看效果图 说明&#xff1a;使用的是mars3d框架&#xff0c;原生的Cesium实现方式可以绕道~ 实现方式&#xff1a; <template><div id"mars3dContainer"></div> </template><script setup> i…

Fiddler抓包基础使用

目录 一、设置抓谷歌浏览器https数据包 1、选中以下选项即可 2、若是选中后还是未抓到HTTPS数据包&#xff0c;则可进行以下操作 二、设置抓取Firefox浏览器HTTPS数据包 1、Firefox的代理需设置系统代理&#xff0c;设置→高级→网络设置&#xff0c;设置为系统代理&#…

【深度学习】5-3 与学习相关的技巧 - Batch Normalization

如果为了使各层拥有适当的广度&#xff0c;“强制性”地调整激活值的分布会怎样呢&#xff1f;实际上&#xff0c;Batch Normalization 方法就是基于这个想法而产生的 为什么Batch Norm这么惹人注目呢?因为Batch Norm有以下优点&#xff1a; 可以使学习快速进行(可以增大学习…

广工赢清华,炸裂!

去年2022年广工对阵清华&#xff0c;我在知乎写了文章 清华赢球靠的是广东第一高中生邹阳和2022届CBA状元王岚嵚。 比分焦灼的第四节关键时刻&#xff0c;邹阳在左角底线持球高高举起篮球&#xff0c;那个球的弧度非常高&#xff0c;皮球以稳稳的抛物线弧度掉入篮筐。 之后&…

Python基础(21)——Python函数实战、递归、lambda、高阶函数

Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数 文章目录 Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数目标一. 应用&#xff1a;学员管理系统1.1 系统简介1.2 步骤分析1.3 需求实现1.3.1 显示功能界面…

Streamlit基础教程

streamlit是什么 streamlit是一个开源的python库&#xff0c;它能够快速的帮助我们创建定制化的web应用&#xff0c;而且还非常便于和他人分享&#xff0c;特别是在机器学习和数据科学领域。整个过程不需要你了解任何前端的知识&#xff0c;包括html、css、javascript等&#x…

Vue3 计算属性和侦听器实战(computed、watch)——简易点餐页面

文章目录 &#x1f4cb;前言&#x1f3af;项目介绍&#x1f3af;项目创建&#x1f3af;代码分析&#x1f3af;完整代码&#xff08;含 CSS 代码&#xff09;&#x1f4dd;最后 &#x1f4cb;前言 这篇文章记录一下 Vue3 计算属性和侦听器 &#xff08;computed、watch&#xf…

网络安全自学能学会吗?网络安全如何学习

网络安全是近年来的热门工作&#xff0c;吸引了许多小伙伴开始学习网络安全知识。那么我们应该如何学习网络安全呢&#xff1f;这是一个很多人都在考虑的问题。网络安全可以自学吗&#xff1f;自学网络安全能不能学会&#xff1f; 无论什么知识都是自学的&#xff0c;只是说每…

数学物理学家心中的十大最美方程

“你认为最美的数学、物理方程是什么&#xff1f;”当代十位大数学家、物理学家给出了他们自己的回答。这些回答构成了大雅之美&#xff08;The Concinitas Project&#xff09;的十篇文章。我们为读者带来这些大师对自己眼中最美方程的精彩解读。 1.指标定理 撰文 阿蒂亚爵士…

机器翻译与自动文摘评价指标 BLEU 和 ROUGE

机器翻译与自动文摘评价指标 BLEU 和 ROUGE 在机器翻译任务中&#xff0c;BLEU 和 ROUGE 是两个常用的评价指标&#xff0c;BLEU 根据精确率(Precision)衡量翻译的质量&#xff0c;而 ROUGE 根据召回率(Recall)衡量翻译的质量。 1.机器翻译评价指标 使用机器学习的方法生成文…

安科瑞AWT100无线数据采集通信终端

安科瑞AWT100无线数据采集通信终端 安科瑞 崔丽洁

js \d正则匹配数字失败问题记录

记录一次的正则匹配数字失败的问题 在一次开发中&#xff0c;需要匹配卡号&#xff0c;正则表达式较为复杂&#xff0c;想通过元字符进行简化&#xff0c;便由&#xff1a; new RegExp(^622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[01][0-9]|92[0-5])[0-9]{10,}$)变成&#xff…

EMQ的使用和介绍

首先先了解一下底层的协议: 1. MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅 &#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建…

【盘点】百家量子企业正展露头角

光子盒研究院 量子计算是一个可能彻底改变我们在金融、材料科学、密码学和药物发现等领域解决复杂问题的方式。过去十年左右&#xff0c;量子计算初创公司正迅速崛起。 现在&#xff0c;根据光子盒的量子企业数据库&#xff0c;全球大约有一千家公司直接参与到量子技术中&#…

反调试技术

文章目录 前言系统API实现方式IsDebuggerPresent (0x2)NtGlobalFlag&#xff08;0x68&#xff09;Heap flags&#xff08;0x18&#xff09;CheckRemoteDebuggerPresentNtQueryInformationProcessZwSetInformationThread 示例示例1比较明文字符串和输入字符串NtGlobalFlag时间差…

支持向量机SVM的原理和python实现

文章目录 1 SVM概述1.1 概念1.2 SVM的优缺点1.2.1 优点1.2.2 缺点 2 在python中使用SVM2.1 scikit-learn库2.2 SVM在scikit-learn库中的使用2.2.1 安装依赖库2.2.2 svm.SVC2.2.3 应用实例 总结 1 SVM概述 1.1 概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式…