基于注解@Transactional事务基本用法

news2024/11/15 21:23:45

关于概念性的放在最下面,熟读几遍

在使用时候也没多关注,总是加个@Transactional

初识下

一般查询

 @Transactional(propagation = Propagation.SUPPORTS)

增删改

@Transactional(propagation = Propagation.REQUIRED)

当然不能这么马虎

Spring中关于事务的传播

一个个测试,事务注解点进去看下,他其实

 

 测试类

 首先将表清空

 第一次测试,不添加任何事务注解

程序在saveChildren()中会报错,导致的结果:因为没有添加事务注解  saveChild1()运行成功

但是saveChild2因为报错没有执行到

 

现在测试@Transactional

默认是@Transactional(propagation=Propagation.REQUIRED) 

 清空数据库

 执行测试方法

 结果就是因报错,事务回滚,一条数据也没有插入

再来测试另外一个

 结果是

 原因:saveParent()方法没有报错,且没有事务,因此插入成功

而saveChildren()方法中有事务且报错,事务回滚,

 上面测试的是REQUIRED

在Spring事务传播中  

REQUIRED:使用当前的事务,如果当前没有事务,则自己新建一个事务

下面测试SUPPORTS

清空表 运行测试

结果

 

 继续测试

 清空表  运行测试

结果

Spring事务传播中

SUPPORTS:如果当前有事务,则使用事务,如果当前没有事务,则不使用事务,适用于查询

关于REQUIRED和SUPPORTS是比较常用的

REQUIRED一般用于增删改

SUPPORTS一般用于查询即可

下面测试MANDATORY

清空表运行测试  和原先的REQUIRED和SUPPORTS的报错有区别  原先是/ by zero

现在是

继续测试

清空表 运行测试  报by zero

Spring事务传播中

MANDATORY:该传播属性强制必须存在一个事务,如果不存在则抛出异常 

下面演示REQUIRES_NEW

 清空表测试  还是by zero错误

 

 

REQUIRES_NEW

意思开启一个新的事务,在我的事务里,如果报错了,会回滚,但是与外层事务无关

这里注意和REQUIRED的区分比如说,以便更好理解REQUIRED_NEW

 清空测试

REQUIRED是在同一个事务    REQUIRED_NEW是新建一个事务

NOT_SUPPORTED和NEVER:都表示不支持事务,不管当前有没有事务,我反正当他没有事务

演示一下,下面表示的意思就是父方法没有事务,而自己本身又不支持事务

猜测就是saveParent成功saveChild1成功,saveChild2失败

 清空表,测试运行

 继续测试  外层有事务

 清空表  运行测试

原因是外层用了事务,报错了,对于外层来说,所有都要回滚  因此saveParent虽然成功了,但是子方法报错,因此回滚,而在子方法中又有NOT_SUPPORTED .....因此child1成功,child2报错,因我不支持事务... 

NOT_SUPPORTED:如果当前有事务,则挂起,自己不启用事务,一般用于查询

NEVER:没有事务,如果外层有事务会抛出一个异常

如上图这样就会抛出一个状态异常

下面这个报正常的错误by zero,且因不支持事务  child1成功  child2失败

NESTED:当前有一个事务存在的前提下,他会开启一个嵌套事务,父子事务.否则如果当前没有事务,他的作用和REQUIRED一样

NESTED和REQUIRED_NEW是反作用的

NESTED注意下,如果外层有事务,外层事务可以try catch,避免因NESTED事务引起整体回滚

1.什么是事务?

  • 事务(TRANSACTION) 是作为单个逻辑工作单元执行的一系列操作。

  • 多个操作作为一个整体向系统提交,要么都执行,要么都不执行。

  • 事务是一个不可分割的逻辑单元。

2.事务的特性(ACID)

  • 原子性(Atomicity)  原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency)  事务前后数据的完整性必须保持一致。

  • 隔离性(Isolation)        事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  • 持久性(Durability)       持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

 3.什么是脏读,不可重复读,幻读?

  • 脏读:简单来说,就是一个事务读取到了另一个事务未提交的数据。

  • 不可重复读:就是说,比如在A事务中进行多次相同的查询,B事务在A事务多次查询之间修改对应表中的数据,导致A事务多次读取的结果不一致。

  • 幻读:举例来说,就是A事务将表中'性别'列的值都更改为1,B事务在A事务修改之后又添加了一条记录,而'性别'的值为0,回过来A再查询所以的记录时会发现有一条记录的'性别'为0,这种情况就是所谓的幻读

4.事务的四种隔离级别

  • ISOLATION_READ_UNCOMMITTED:读未提交

  • ISOLATION_READ_COMMITTED:读已提交

  • ISOLATION_REPEATABLE_READ:可重复读 

  • ISOLATION_SERIALIZABLE:串行化

5.四种隔离可以解决的问题

  

6.事务的七种传播行为

什么是事务的传播行为:事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

  • PROPAGATION_REQUIRED 表示当前方法必须在一个具有事务的 上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。( 如果被调用端发生异常,那

    么调用端和被调用端事务都将回滚)

  • PROPAGATION_SUPPORTS 表示当前方法不必需要具有一个事务 上下文,但是如果有一个事务的话,它也可以在这个事务中运行

  • PROPAGATION_MANDATORY 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常

  • PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

  • PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

  • PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常

  • PROPAGATION_NESTED表示如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中 ,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同propagation. required的一样

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

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

相关文章

计算机网络第八版——第一章课后题答案(超详细)

第一章 该答案为博主在网络上整理,排版不易,希望大家多多点赞支持。后续将会持续更新(可以给博主点个关注~ 【1-01】计算机网络可以向用户提供哪些服务? 解答:这道题没有现成的标准答案,因为可以从不同的…

操作系统——15.FCFS、SJF、HRRN调度算法

这节我们来看一下进程调度的FCFS、SJF、HRRN调度算法 目录 1.概述 2.先来先服务算法(FCFS,First Come First Serve) 3.短作业优先算法(SJF,Shortest Job First) 4.高响应比优先算法(HRRN&…

Jackson CVE-2018-5968 反序列化漏洞

0x00 前言 同CVE-2017-15095一样,是CVE-2017-7525黑名单绕过的漏洞,主要还是看一下绕过的调用链利用方式。 可以先看: Jackson 反序列化漏洞原理 或者直接看总结也可以: Jackson总结 影响版本:至2.8.11和2.9.x至…

【数据结构】AVL平衡二叉树底层原理以及二叉树的演进之多叉树

1.AVL平衡二叉树底层原理 背景 二叉查找树左右子树极度不平衡,退化成为链表时候,相当于全表扫描,时间复杂度就变为了O(n) 插入速度没影响,但是查询速度变慢,比单链表都慢,每次都要判断左右子树是否为空 需…

java Spring JdbcTemplate配合mysql实现数据批量修改

其实这个操作和批量添加挺像的 调的同一个方法 首先 我们看数据库结构 这是我本地的 mysql 里面有一个test数据库 里面有一张user_list表 然后创建一个java项目 然后 引入对应的JAR包 在src下创建 dao 目录 在下面创建一个接口 叫 BookDao 参考代码如下 package dao;impo…

进程控制~

进程控制 (创建、终止,等待,程序替换) 进程创建: pid_t fork();父子进程,数据独有,代码共享,各有各的地址 pit_t vfork();父进程阻塞,直到子进程exit退出或者程序替换之…

电力系统稳定性的定义与分类

1电力系统稳定性的定义与分类 IEEE给出电力系统稳定性定义:电力系统稳定性是指电力系统这样的一种能力—对于给定的初始运行状态,经历物理扰动后,系统能够重新获得运行平衡点的状态,同时绝大多数系统变量有界,因此整个…

自己写一个简单的IOC

什么是SpringIOC? 答:IOC即控制反转,就是我们不在手动的去new一个对象,而是将创建对象的权力交给Spring去管理,我们想要一个User类型的对象,就只需要定义一个User类型的变量user1,然后让Spring去…

蓝桥杯-刷题统计

蓝桥杯-刷题统计1、问题描述2、解题思路3、代码实现3.1 方案一:累加方法(超时)3.2 方案二1、问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数…

KNN学习报告

原理 KNN算法就是在其表征空间中,求K个最邻近的点。根据已知的这几个点对其进行分类。如果其特征参数只有一个,那么就是一维空间。如果其特征参数只有两个,那么就是二维空间。如果其特征参数只有三个,那么就是三维空间。如果其特征…

软件设计师教程(七)计算机系统知识-操作系统知识

软件设计师教程 软件设计师教程(一)计算机系统知识-计算机系统基础知识 软件设计师教程(二)计算机系统知识-计算机体系结构 软件设计师教程(三)计算机系统知识-计算机体系结构 软件设计师教程(…

Redis十大类型——Hash常见操作

Redis十大类型——Hash常见操作命令操作简列存放及获取获取健值对长度元素查找列出健值对对数字进行操作赋值hsetnx很明显咯它也是以健值对方式存在的,只不过value也就是值,在这里也变成了一组简直对。 🍊个🌰: 想必多…

【Linux】P3 用户与用户组

用户与用户组root 超级管理员设置超级管理员密码切换到超级管理员sudo 临时使用超级权限用户与用户组用户组管理用户管理getentroot 超级管理员 设置超级管理员密码 登陆后不会自动开启 root 访问权限,需要首先执行如下步骤设定 root 超级管理员密码 1、解除 roo…

【C++】string的使用及其模拟实现

文章目录1. STL的介绍1.1 STL的六大组件1.2 STL的版本1.3 STL的缺陷2. string的使用2.1 为什么要学习string类?2.2 常见构造2.3 Iterator迭代器2.4 Capacity2.5 Modifiers2.6 String operations3. string的模拟实现3.1 构造函数3.2 拷贝构造函数3.3 赋值运算符重载和…

DevOps实战50讲-(2)Jenkins配置

1. Docker镜像方式安装拉取Jenkins镜像docker pull jenkins/jenkins编写docker-compose.ymlversion: "3.1" services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/首次启动会因为数据…

iis之web服务器搭建、部署(详细)~千锋

目录 Web服务器 部署web服务器 实验一 发布一个静态网站 实验二 一台服务器同时发布多个web站点 网站类型 Web服务器 也叫网页服务或HTTP服务器web服务器使用的协议是HTTPHTTP协议端口号:TCP 80、HTTPS协议端口号:TCP 443Web服务器发布软件&…

【备战面试】每日10道面试题打卡-Day4

本篇总结的是Java集合知识相关的面试题,后续也会更新其他相关内容 文章目录1、HashMap在JDK1.7和JDK1.8中有哪些不同?2、HashMap 的长度为什么是2的幂次方?3、HashMap的扩容操作是怎么实现的?4、HashMap是怎么解决哈希冲突的&…

Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解

一、RadioButton(单选按钮) 1.1、简介 RadioButton表示单选按钮,是button的子类,每一个按钮都有选择和未选中两种状态,经常与RadioGroup一起使用,否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…

滚动升级回滚

滚动升级回滚 ReplicationController 资源文件 apiVersion: v1 kind: ReplicationController metadata:name: kubia-v1labels:app: kubia spec:replicas: 3template:metadata:name: kubialabels:app: kubiaspec:containers:- image: luksa/kubia:v1name: nodejes --- apiVer…

【Linux学习】基础IO——软硬链接 | 制作动静态库

🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 基础IO🍓软硬链接🌲软链接🌲硬链接🍓动静态库&…