MYSQL事务原理分析

news2024/9/22 13:34:38

目录

  • 事务是什么
  • ACID特性
    • 原子性(A)
    • 隔离性(I)
    • 持久性(D)
    • 一致性(C)
  • 隔离级别
    • 简介
    • 有些什么
      • READ UNCOMMITTED(读未提交)
      • READ COMMITTED(读已提交)
      • REPEATABLE READ(可重复读)
      • SERIALIZABLE
    • 实现
      • MVCC
      • 锁类型
      • 锁算法
  • 修改事务隔离性
  • 并发异常
    • 读异常
      • 脏读
      • 不可重复读
      • 幻读
      • 丢失更新
        • 回滚覆盖
        • 提交覆盖
    • 并发死锁
      • 原因
      • 查看死锁
        • 系统表
        • 开启日志
        • 线上查看
        • 如何避免死锁

事务是什么

  1. 将数据库从一种一致性状态转换为另一种一致性状态
  2. 可以是一条语句,也可以是一组语句

ACID特性

原子性(A)

  1. 事务操作要么都做(提交),要么都不做(回滚)
  2. 事务是访问并更新数据库各种数据项的一个程序执行单元,是不可分割的工作单位
  3. 通过 undolog 来实现回滚操作。undolog 是将事务每步具体操作记录在共享表中,当回滚时,回放事务具体操作的逆运算

隔离性(I)

  1. 事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,并发事务之间不会相互影响,设定了不同程度的隔离级别,通过适度破环一致性,得以提高性能
  2. 通过 MVCC 和 锁来实现
  3. 数据库中提供粒度锁的策略,针对表(聚集索引B+树)、页(聚集索引B+树叶子节点)、行(叶子节点当中某一段记录行)三种粒度加锁

持久性(D)

  1. 事务提交后,事务DML操作将会持久化(写入 redolog 磁盘文件 哪一个页 页偏移值 具体数据)
  2. 即使发生宕机等故障,数据库也能将数据恢复。redolog 记录的是物理日志

一致性(C)

  1. 一致性指事务将数据库从一种一致性状态转变为下一种一致性的状态,在事务执行前后,数据库完整性约束不会被破坏
  2. 一个事务单元需要提交之后才会被其他事务可见。例如:一个表的姓名是唯一键,如果一个事务对姓名进行修改,但是在事务提交或事务回滚后,表中的姓名变得不唯一了,这样就破坏了一致性
  3. 一致性由原子性、隔离性以及持久性共同来维护的

隔离级别

简介

  1. ISO 和 ANIS SQL 标准制定了四种事务隔离级别的标准,各数据库厂商在正确性和性能之间做了妥协,并没有严格遵循这些标准;
  2. MySQL innodb默认支持的隔离级别是 REPEATABLE READ

有些什么

READ UNCOMMITTED(读未提交)

  1. 该级别下读不加锁,
  2. 写加排他锁
  3. 写锁在事务提交或回滚后释放锁

READ COMMITTED(读已提交)

  1. 从该级别后支持 MVCC ,也就是提供一致性非锁定读
  2. 此时读取操作读取历史快照数据
  3. 该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据

REPEATABLE READ(可重复读)

  1. 支持MVCC
  2. 此时读取操作读取事务开始时的版本数据

SERIALIZABLE

实现

MVCC

  1. 多版本并发控制,
  2. 读取过程中,遇到其他进、线程对该资源加写锁(X锁,又称行写锁、排他锁),则读取该资源的快照(以前存储的数据)。

  1. 用来处理并发 DML 操作

锁类型

  1. 表锁
  2. 页锁
  3. 行锁(记录锁)
  4. 共享锁(S锁)
    在 SERIALIZABLE 隔离级别下,默认帮读操作加共享锁
    在 REPEATABLE READ 隔离级别下,需手动加共享锁,可解决幻读问题
    在 READ COMMITTED 隔离级别下,没必要加共享锁,采用的是 MVCC
    在 READ UNCOMMITTED 隔离级别下,既没有加锁也没有使用 MVCC
    手动加S锁:
select * from xxx lock in share mode;
  1. 排他锁 (X锁)
    事务删除或更新加的锁;对某一行加锁
    插入的时候,会在中间再加一个插入意向锁
    在4种隔离级别下,都添加了排他锁,事务提交或事务回滚后释放锁
    手动加X锁:
select * from xxx for update;
  1. 意向共享锁(IS)
    仅仅为了告知即将操作的事务:当前有事务进正在进行访问,且其中几行已经加入共享锁
  2. 意向排他锁(IX)
    仅仅为了告知即将操作的事务:当前有事务进正在进行访问,且其中几行已经加入排他锁
  3. 意向锁
    该表中存在锁,表明该锁正在接受某事务访问
    目的:排除表层次的锁操作
  4. AUTO-INC Lock (AI锁)
    自增锁,是一种特殊的表级锁,发生在 AUTO_INCREMENT 约束下的插入操作。
    采用的一种特殊的表锁机制。
    完成对自增长值插入的SQL语句后立即释放。
    在大数据量的插入会影响插入性能,因为另一个事务中的插入会被阻塞。
    从MySQL 5.1.22开始提供一种轻量级互斥量的自增长实现机制,该机制提高了自增长值插入的性能。
    较低概率造成B+树的分裂。
  5. 锁的兼容性
    在这里插入图片描述
    注:其中IS、IX与S、X的冲突是当X、S为全表操作时候会产生冲突,单行操作并不会产生冲突
    意向锁不会与行锁冲突!!!

锁算法

  1. Record Lock
    单个行记录上的锁

  2. Gap Lock
    间隙锁,锁定一个范围,但不包含记录本身, 全开区间
    解决幻读问题
    REPEATABLE READ级别支持间隙锁
    产生死锁重要原因之一

  3. Next-Key Lock (记录锁+间隙锁)
    产生死锁重要原因之一
    锁定一个范围,并且锁住记录本身,左开右闭区间
    REPEATABLE READ级别支持间隙锁

  4. Insert Intention Lock (插入意向锁)
    插入意向锁,insert操作的时候产生。
    在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。
    提升插入的并发性能。
    假设有一个记录索引包含键值4和7,两个不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。
    产生死锁重要原因之一

  5. AUTO-INC Lock (AI锁)
    比行插入方式,较低概率造成B+数的分裂,所以它的性能更高

  6. 锁兼容
    在这里插入图片描述
    如果有事务已经持有insert Intention key, 这个时候不会影响其他事务
    如果有事务想要执行insert Intention key 但是这个时候已经有事务持有了GAP或者NEXT-KEY, 则会产生阻塞

修改事务隔离性

# set transaction isolation level read uncommitted;
# set transaction isolation level read committed;
# set transaction isolation level repeatable read;
set transaction isolation level SERIALIZABLE;
begin
select * from table;
update table_a set name='lsy';
delete from table_b;
commit

并发异常

读异常

在这里插入图片描述

  1. 一个事务已经获取了插入意向锁,对其他事务是没有任何影响的
  2. 一个事务想要获取插入意向锁,如果有其他事务已经加了 gap lock 或 Next-key lock 则会阻塞

脏读

事务A可以读到事务B未提交的数据

不可重复读

两次读取同一条记录,读到了不一样的结果,因为有其他事务对该数据做了修改

幻读

两次读取同一范围内的记录,结果的集合不一样
由于repeatable read中规定:读取事务开始前前的版本行数据,那么在该隔离级别下,不管该事务中对改行数据做什么操作,该数据都将不变

丢失更新

回滚覆盖

该问题已经被数据库修复,数据库将拒绝该操作,
该问题会将数据回滚为事务开始之前的数据
比如事务a读取数据后做了回滚,在这期间,事务B对该数据做了修改,结果事务a回滚时候将使得事务B的操作无效

提交覆盖

两个事务同时写一个数据,后提交的事务覆盖掉了先提交的数据

并发死锁

使用 wait-for graph的方式进行死锁检测
异常报错:deadlock found when trying to get lock

原因

  1. 相反方向加锁
  2. 隔离级别冲突

查看死锁

系统表

-- 开启标准监控
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
-- 关闭标准监控
DROP TABLE innodb_monitor;
-- 开启锁监控
CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB;
-- 关闭锁监控
DROP TABLE innodb_lock_monitor

开启日志

-- 开启标准监控
set GLOBAL innodb_status_output=ON;
-- 关闭标准监控
set GLOBAL innodb_status_output=OFF;
-- 开启锁监控
set GLOBAL innodb_status_output_locks=ON;
-- 关闭锁监控
set GLOBAL innodb_status_output_locks=OFF;
-- 将死锁信息记录在错误日志中
set GLOBAL innodb_print_all_deadlocks=ON;

线上查看

-- 查看事务
select * from information_schema.INNODB_TRX;
-- 查看锁
select * from information_schema.INNODB_LOCKS;
-- 查看锁等待
select * from information_schema.INNODB_LOCK_WAITS;

如何避免死锁

  1. 尽可能以相同顺序来访问索引记录和表;
  2. 如果能确定幻读和不可重复读对应用影响不大,考虑将隔离级别降低为RC;
  3. 添加合理的索引,不走索引将会为每一行记录加锁,死锁概率非常大;
  4. 尽量在一个事务中锁定所需要的所有资源,减小死锁概率;
  5. 避免大事务,将大事务分拆成多个小事务;大事务占用资源多,耗时长,冲突概率变高;
  6. 避免同一时间点运行多个对同一表进行读写的概率;

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

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

相关文章

【17】Java常见的面试题汇总(设计模式)

目录 1. 说一下你熟悉的设计模式? 2. 简单工厂和抽象工厂有什么区别? 1. 说一下你熟悉的设计模式? 单例模式:保证被创建一次,节省系统开销。 工厂模式(简单工厂、抽象工厂):解耦…

力扣(LeetCode)60. 排列序列(C++)

枚举 枚举每一位可能的数字。 如图。算法流程如上图。 思路分析 : 一个数 nnn ,可以组成的排列数量有 n!n!n! 。当首位确定,剩余位能组成的排列数量 (n−1)!(n-1)!(n−1)! ,依次类推 (n−2)!/(n−3)!/(n−4)!/…/2!/1!/0!(n-2)!/(n-3)!/(n…

CentOS7安装MYSQL8.X的教程详解

1-首先查看系统是否存在mysql,无则不返回 1 # rpm -qa|grep mysql 2-安装wget 1 # yum -y install wget 3-抓取mariadb并删除包,无则不返回 1 # rpm -qa|grep mariadb 4-删除mariadb-libs-5.5.68-1.el7.x86_64 1 # rpm -e --nodeps mariadb-libs-…

本节作业之数组求和及其平均值、求数组最大值、最小值、数组转换为分割字符串、新增数组案例、筛选数组案例、删除指定数组元素、翻转数组、数组排序(冒泡排序)

本节作业之数组求和及其平均值、求数组最大值、最小值、数组转换为分割字符串、新增数组案例、筛选数组案例、删除指定数组元素、翻转数组、数组排序<冒泡排序>求数组[2,6,1,7,4]里面所有的元素的和以及平均值求数组[2,6,1,77,52,25,7]中的最大值求数组[2,6,1,77,52,25,7…

Linux - netstat 查看系统端口占用和监听情况

文章目录功能语法示例显示 tcp&#xff0c;udp 的端口和进程Show both listening and non-listening socketsList all tcp ports.List all udp portsList only listening portsList only listening TCP ports.List only listening UDP ports.List only the listening UNIX port…

Android 性能优化方法论【总结篇】

作为一位多年长期做性能优化的开发者&#xff0c;在这篇文章中对性能优化的方法论做一些总结&#xff0c;以供大家借鉴。 性能优化的本质 首先&#xff0c;我先介绍一下性能优化的本质。我对其本质的认知是这样的&#xff1a;性能优化的本质是合理且充分的使用硬件资源&#x…

分享感恩节联系客户话术

看了一眼在手边的日历&#xff0c;发现今天是11月24日&#xff0c;一年一度的感恩节又到了&#xff0c;不得不感叹时间过得真快&#xff0c;每年十一月的第四个星期四是感恩节。 随着各国多元文化的发展&#xff0c;感恩节也越来越被世界各地传颂&#xff0c;多少都会有一些影…

WANLSHOP 直播短视频种草多用户电商系统源码自营+多商户+多终端(H5+小程序+APP)

WANLSHOP高级版 可用于自营外包项目(多主体)、 可用于外包定制开发项目、 提供开源源码&#xff0c;私有化部署、一款基于 FastAdmin Uni-APP 开发的 多终端&#xff08;H5移动端、APP、微信小程序、微信公众号&#xff09;、多用户商城系统拥有多种运营模式B2B2C/B2C&#xf…

python安装依赖库

一、安装pip 1、打开终端&#xff0c;输入&#xff1a; pip3 install tushare -i https://pypi.douban.com/simple 2、验证是否安装成功 打开终端&#xff0c;输入&#xff1a;pip3 出现以上页面&#xff0c;则安装成功 二、安装flask 1、打开终端&#xff0c;输入&…

mybatis-plus学习笔记

文章目录1 简介2 初始化项目2.1引入pom2.2 引入lombok插件2.3 配置信息2.4 创建实体类2.5 创建mapper2.6 配置注解MapperScan2.7 编写测试类2.8 配置MyBatis日志3 测试基本的CRUD3.1 新增3.2 查询3.3 修改3.4 删除4 自定义动态sql5 Service 层使用mybatis-plus方法5.1 service层…

使用hive进行大数据项目分析

目录 一、首先要创建表&#xff1a;在txt记事本中先输入创建语句备用&#xff0c;创建class1~class5的表。 二、启动hadoop集群&#xff0c;MySQL&#xff0c;hive。 三、创建数据库zhh&#xff0c;用户为zhh&#xff0c;之后将之前写在txt记事本里的创建表class1~class5的命…

浅谈企业信息化安全建设中的三大误区

伴随着信息化的深度建设与应用&#xff0c;与之相伴的信息安全事件也层出不穷&#xff01;很多企业开始关注信息安全问题、关注信息安全建设&#xff0c;大家的共识已经达到前所未有的高度。 虽然许多的企业虽然认识到信息安全的重要性&#xff0c;在实际实施过程中却又无从下…

【附源码】计算机毕业设计JAVA亦心化妆品网站

【附源码】计算机毕业设计JAVA亦心化妆品网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA myba…

【软件测试】我们测试人搭上元宇宙的列车,测试一直在进军......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 虚拟宇宙&#xff0…

微信抽奖小程序开发_分享微信抽奖小程序制作的步骤

各位商家在节日期间做活动的时候&#xff0c;都希望用更少的费用去或者更好的宣传和推广的效果。比较常见的就是抽奖活动小程序。无须玩家下载&#xff0c;通过微信扫码或者指定入口就可以参与。 方便&#xff0c;效果又好。 那么,性价比高的抽奖活动小程序怎么做&#xff1f…

使用 MITRE ATTCK 技术保护您的 Active Directory安全

Active Directory (AD域)保存着企业的敏感数据&#xff0c;例如用户凭据、员工的个人信息、安全权限等。正因为如此&#xff0c;AD域很容易成为网络攻击者的目标。恶意攻击者不断升级新的攻击策略&#xff0c;使企业保护AD域安全成为一项挑战。这就是为什么每个企业都必须制定网…

scratch猫捉老鼠 电子学会图形化编程scratch等级考试一级真题和答案解析2022年9月

目录 scratch猫捉老鼠 一、题目要求 1、准备工作 2、功能实现 二、案例分析

【U8+】用友U8成本管理模块下,定额分配标准中无法取到新增存货的数据。

【问题描述】 用友U8&#xff0c;新增存货后&#xff0c; 在【成本管理】模块下&#xff0c;操作【定额分配标准】取数后&#xff0c;无法取到新增存货数据。 【解决方案】 由于没有过多的研究过用友U8的成本管理模块&#xff0c; 以下过程是在处理该问题时&#xff0c;整理的…

java发送邮件

前言 借用hutool工具&#xff0c;实现多账号发送邮件 相关实现 maven依赖 Hutool对所有第三方都是可选依赖&#xff0c;因此在使用MailUtil时需要自行引入第三方依赖。 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</arti…

机器学习笔记之高斯网络(一)基本介绍

机器学习笔记之高斯网络——基本介绍引言回顾&#xff1a;条件独立性概率图模型高斯网络高斯网络介绍高斯网络的条件独立性随机变量之间的边缘独立随机变量之间的条件独立引言 本节将介绍高斯网络 回顾&#xff1a; 条件独立性 在概率图模型——背景介绍中介绍了条件独立性…