mysql spring隔离级别_MySQL事务与Spring隔离级别实现

1、事务具有ACID特性

原子性(atomicity):一个事务被事务不可分割的最小工作单元,要么全部提交,要么全部失败回滚。

一致性(consistency):数据库总是从一致性状态到另一个一致性状态,它只包含成功事务提交的结果

隔离型(isolation):事务所做的修改在最终提交一起,对其他事务是不可见的

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

2、事务的隔离级别

1)隔离级别的定义与问题

READ UNCOMMITTED(读未提交):事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读。

READ COMMITTED(读已提交):事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。

PEPEATABLE READ(可重复读):这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务A读取某一个范围的数据时,另一个事务B在这个范围插入行,A事务再次读取这个范围的数据时,会产生幻行。特别说明:InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读问题,它使用间隙锁(next-key locking)锁定查询涉及的行和索引中的间隙,防止幻影行的插入。

SERIALIZABLE(可串行化):这个事务是最高的隔离级别,它强制事务串行执行,避免了幻读问题。简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁竞争

隔离级别

脏读可能性

不可重复度可能性

幻读可能性

加锁读

READ UNCONMITED

Yes

Yes

Yes

No

RED COMMITED

No

Yes

Yes

No

REPEATABLE READ

No

No

Yes

No

SERIALIZABLE

No

No

No

Yes

2)如果查看修改和MySQL的隔离级别

show variables like 'tx_isolation'; # 查看隔离级别,MySQL8以前

show variableslike 'transaction_isolation'; # 查看隔离级别,MySQL8set global transaction_isolation='READ-COMMITTED'; // 设置隔离级别,阀域READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE

事务的隔离级别可以是Session层的,我们可以对不同的Session设置不同级别:

set session transaction isolation level read uncommitted;set session transaction isolation level read committed;set session transaction isolation level repeatable read;set session transaction isolation level serializable;

3)Spring事务隔离级别

Spring事务默认使用数据库的隔离级别,可以通过注解@Transactional中的isolation参数调整Session级的隔离级别。隔离级别是会话级别的,JDBC的java.sql.Connection接口支持隔离级别的设置。

9f405ad6754c5dfde5f3269788e11680.png

Spring在开启事务时(DataSourceTransactionManager.doBegin),根据注解配置,对Connection的隔离级别进行设置:

d67fa3b45df57491f0f7eec8ab01464d.png

MySQL驱动com.mysql.cj.jdbc.ConnectionImpl执行SQL语句调整会话级的隔离级别

c3f741d42f570be365fa0c7214c21d68.png

3、死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。死锁示例:

# 事务一

starttransaction;update account set money=10 where id=1;update account set money=20 where id=2;commit;

# 事务二

starttransaction;update account set money=10 where id=2;update account set money=20 where id=1;commit;

假设碰巧,事务一和事务二同时执行完第一个update语句,接着准备执行第二条update语句,却发现记录已被对方锁定,然后2个事务都等待对方释放资源,同时持有对方需要的锁,这样就会出现死循环。

为了避免死锁问题,数据库实现了各种死锁检测和死锁超长机制,InnoDB处理死锁的方式是:将持有最少行级排他锁的事务进行回滚。

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

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

相关文章

关闭程序

System.Diagnostics.Process.GetCurrentProcess().Kill();//关闭程序转载于:https://www.cnblogs.com/CandiceW/p/4204564.html

Java JDK 安装配置

文章目录1. 下载安装2. 配置环境变量3. 检查安装成功1. 下载安装 下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html(需要注册下载) 以下操作环境:WIN 10 2. 配置环境变量 JAVA_HOME 为…

mqtt如何判断设备离线_反渗透纯水设备膜元件如何离线清洗?

原标题:反渗透纯水设备膜元件如何离线清洗?在反渗透设备正常运行,无故障时,反渗透系统一般都用在线清洗保养、冲击性杀菌以及定期保护。但是,如果当反渗透膜元件重度污染时,在线清洗就显得无能为力了&#…

mysql的表servers_ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist

修改用户权限,刷新权限表,报1146mysql> flush privileges;ERROR1146 (42S02): Table mysql.servers doesnt existmysql> use mysql;mysql> show tables;可以看到servers表,在系统mysql 目录下,可以看到server.ibd 和serv…

HelloJava,我的第一个Java程序

HelloWorld.java public class HelloWorld { // HelloWorld 需要和文件名一致,因为 public// 一个文件最多一个 public 类// 如果该文件没有 public 类,则文件名随意取public static void main(String[] args) {float i 10.2f;i;//浮点数可以 System.…

python冒泡算法_python_冒泡算法

什么是冒泡算法? -- 像鱼吐泡泡一样,每次都是向上冒出一个水泡 如何逻辑整理? -- 先拿第一个值和剩下的值,一一比较,必能找到最大的或者最小的 -- 比较过程中,第一个值小于剩下的某个值,交换位置…

MongoDB的Java驱动使用整理 (转)

MongoDB Java Driver 简单操作 一、Java驱动一致性 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个)。 对于有大量写和读的环境中,为了确保…

Java 变量、数据类型

文章目录1. 变量、常量2. 数据类型1. 变量、常量 final 修饰常量 public class Variable {static final int YEAR 365;// 常量使用 final 修饰, 不可修改,类似C的 conststatic int day 0;// 成员变量public static void main(String[] args){System.out.println…

html背景图不显示_批量显示多张有序排列的图标,使用精灵图CSS Sprites这种办法...

让你显示一个天气图标你会怎么显示呢&#xff1f;让你做一个简单的动图你会怎么采用什么方式呢&#xff1f;让你输出一个长期固定的图标列表你会怎么编写代码呢&#xff1f;如果不管性能&#xff0c;不用css&#xff0c;不用js&#xff0c;可能你会这么写html&#xff1a;<类…

mysql堵塞等级_MySQL 事务隔离级别

前言简单来说&#xff0c;数据库事务就是保证一组数据操作要么全部成功&#xff0c;要么全部失败。在 MySQL 中&#xff0c;事务是在引擎层实现的。原生的 MyISAM 引擎不支持事务&#xff0c;也是为什么 InnoDB 会取代它的重要原因之一。隔离性与隔离级别当数据库上有多个事务同…

水晶报表取消输入密码最后测试结果

哈哈&#xff0c;找了很多资料终于解决了。 //添加引用 using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类 using CrystalDecisions.CrystalReports .Engine ;//负责解释ReportDocument类private void Page_Load(object sender, System.EventArgs e) //然后在水晶报表…

Java 运算符、表达式、语句

文章目录1. 运算符2. 表达式3. 语句1. 运算符 赋值运算 , -, *, /, % 算术运算 , -, !, ~ 一元运算 关系运算 >, <, >, <, , ! 返回布尔 递增&#xff0c;递减--&#xff0c;支持&#xff08;float&#xff0c;double&#xff09;1, -1 逻辑运算 &&…

安装mysql没有提示设置密码_18.04安装mysql没有提示输入密码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼MySQL 5.7不再弹出root密码设置sudo vi /etc/mysql/debian.cnf显示&#xff1a;# Automatically generated for Debian scripts. DO NOT TOUCH![client]host localhostuser debian-sys-maintpassword fPw**********22socket /v…

arrays中copyof复制两个数组_Java的数组初识和拷贝用法

方法重载&#xff1a;方法名称相同&#xff0c;参数列表不同。不能有两个名字相同、参数类型相同&#xff0c;返回值不同的方法。在进行方法重载时&#xff0c;方法的返回值一定相同&#xff01;&#xff01;&#xff01;方法递归特点&#xff1a;1.必须有结束条件2.每次递归处…

你不知道的 字符集和编码(编码字符集与字符集编码)

我的上篇文章&#xff0c;有朋友提出字符集和编码的区别&#xff0c;我在此立文和大家讨论下 常说的字符集和编码区别&#xff0c;其实就是编码字符集和字符集编码的区别&#xff0c;其实&#xff0c;单单如果只是说字符集&#xff0c;没有任何编码的概念的话&#xff0c;那么字…

Java 数组及多维数组

注意一点&#xff0c;数组每行可以不等长可以两种写法&#xff0c;直接枚举初始化&#xff0c;或者new type [len1][len2]... import java.util.Arrays;public class Myarray {public static void main(String[] args){// 一维数组声明int arr1 [] new int[3];int [] arr2 {…

迷宫搜索问题最短路_【算法常用模板】总结(更新中)

搜索类图类排序类并查集数学类位运算Part1 搜索类bfs 求迷宫问题最短路径(未验证)#include#includeusing namespace std;//用于遍历的结构 (可以添加题目所要求的信息)typedef struct Node{int x,y;int step;}NODE;const int NUM 100; //地图最大范围&#xff0c;根据要求具体…

hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控

作者简介&#xff1a;张博&#xff0c;网易高级信息安全工程师。0x00 简介在入侵检测的过程中&#xff0c;进程创建监控是必不可少的一点&#xff0c;因为攻击者的绝大多数攻击行为都是以进程的方式呈现&#xff0c;所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为…

caffe模型文件解析_Caffe ImageData神经网络基本示例无法解析模型文件

我正在尝试使用我使用caffe库从CSV文件准备的 **_图像数据_** 构建神经网络的最小示例。I am trying to build a minimal example of a neural network with **_IMAGE DATA_** that I have prepared from a CSV file using the caffe libraries.我的原始文本如下&#xff1a;\[…

付忠庆的练习小笔记-Codeforces #277 Div2 C

原题链接 http://codeforces.com/contest/486/problem/C 这个C题显然更水一些 步数可以分为两种 上下一种 左右一种 总步数最小 上下最小左右最小 先讨论上下最小 就是从两个方向去由字母1到字母2 min(dis(A,B),26-dis(A,B)); 然后讨论左右最小 pos是起始指针的位置 1-统一在…