MySQL事务与锁

什么是事务

事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
事务的4大特性:

  • 原子性(Atomicity)
  • 一致性(Consistent)
  • 隔离性(lsolation)
  • 持久性(Durable)

事务并发带来的问题

脏读

一个事务读取到了另一个事务未提交的数据。
在这里插入图片描述

不可重复读

一个事务读取到了另一个事务已修改的数据。
在这里插入图片描述

幻读

一个事务读取到了另一个事务插入后的数据,导致总记录数不一致。
在这里插入图片描述

事务隔离级别

事务并发的三大问题都是数据库读一致性的问题,必须由数据库提供一定的事务隔离机制来解决。
SQL92标准

  • Read Uncommitted(未提交读):未解决任务并发问题,事务未提交的数据对其他事务可见。
  • Read Committed(已提交读):解决脏读问题,只能看到已提交的事务所做的修改,会出现不可重复读、幻读。
  • Repeatable Read(可重复读):解决不可重复读问题,同一个事务多次读取同样的数据结果一定是一致的,会出现幻读。
  • Serializable(串行):解决所有问题。

InnoDB对事务隔离级别的支持程度

事务隔离级别脏读不可重复读幻读
未提交读(Read Uncommitted)可能可能可能
已提交读(Read Committed)不可能可能可能
可重复读(Repeatable Read)不可能不可能在InnoDB中不可能
串行(Serializable)不可能不可能不可能

InnoDB事务隔离级别的实现

RRRC
普通的selectmvccmvcc
加锁的select和更新
select … in share mode
select … for update
insert
update
delete
Record Lock
Gap Lock
Next-key Lock
Record Lock

事务隔离级别区别

  1. RR的间隙锁会导致锁定范围的扩大;
  2. 条件列未使用索引时,RR锁表,RC锁行;
  3. RC的“半一致性”读可以增加update操作的并发性。

事务隔离级别解决方案

第一种

在读取数据前,对其加锁,阻止其他事务对数据进行修改(LBCC)Lock Based Concurrency Control。

第二种

生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取(MVCC)Multi Version Concurrency Control。

MVCC

多版本并发控制(Multiversion Concurrency Control),它是事务隔离级别的无锁化实现方式,用于提高事务的并发效率。

隐藏列

InnoDB会为每张表生成3个隐藏列:

  • ROW_ID:6byte,如果当前表中没有主键,会默认生成一个主键ID;
  • DB_TRX_ID:6byte,最近修改(修改/插入)的事务ID,删除也被视为修改;
  • DB_ROLL_PTR:7byte,存储当前记录之前版本的存储指针,用于回滚。
    在这里插入图片描述

undolog

每次操作的历史记录都会存储在undolog文件中
在这里插入图片描述

ReadView

ReadView在事务中每次查询都会生成一个ReadView(重复读事务隔离级别只会在首次查询时创建),ReadView中有存储当前事务ID、未提交事务ID、未开始事务ID等数据,通过这些信息就可以在undolog中定位到具体的版本。
在这里插入图片描述

在MySQL中InnoDB支持表锁与行锁,MyISAM只支持表锁。
锁的类型如下:

  • 共享锁(行锁):Shared Locks
  • 排它锁(行锁):Exclusive Locks
  • 意向共享锁(表锁):Intention Shared Locks
  • 意向排它锁(表锁):Intention Exclusive Locks

共享锁(行锁)

又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是不能修改。
使用方式:

select * from employee where emp_id = 20003 LOCk IN SHARE MODE;
COMMIT/ROLLBACK;

排他锁(行锁)

又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一条数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有获取了排他锁的事务可以对数据进行读取和修改操作。
使用方式:
delete/update/insert语句默认会加上X锁。

select * from employee where emp_id = 20003 for update;
COMMIT/ROLLBACK;

意向共享锁(表锁)

意向锁是由数据引擎自己维护的,用户无法手动操作意向锁。
意向锁仅仅只是给表加上一个标识,表明该表已经有行锁了,如果此时有事务需要对该表进行表锁,通过该标识判断即可,而不需要全表扫描判断该表是否有加行锁。
简称IS锁,表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先获取该表的IS锁。

意向排他锁(表锁)

简称IX锁,表示事务准备给数据行加入排他锁,说明事务在给一个数据行加排他锁前必须先获取该表的IX锁。

锁的算法

记录锁

使用唯一/主键索引等值查询时,精准匹配到一条记录。

select * from tab where id = 4 for update //锁住的就是id=4所在的记录行

在这里插入图片描述

间隙锁

查询的记录不存在时,锁住一块区间。

// 锁住(4,7)
select * from tab where id > 4 and id < 7 for update;
select * from tab where id = 6 for update;// 锁住(10,+∞)
select * from tab where id > 15 for update;

在这里插入图片描述

临键锁

范围查询,包含记录和区间

// 锁住(4,7](7,10]
select * from tab where id > 5 and id < 9 for update;

在这里插入图片描述

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

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

相关文章

Python 用pygame简简单单实现一个打砖块

# -*- coding: utf-8 -*- # # # Copyright (C) 2024 , Inc. All Rights Reserved # # # Time : 2024/3/30 14:34 # Author : 赫凯 # Email : hekaiiii163.com # File : ballgame.py # Software: PyCharm import math import randomimport pygame import sys#…

Linux 个人笔记之三剑客 grep sed awk

文章目录 零、预一、grep 文本过滤工具基础篇实战篇 二、sed 字符流编辑器基础篇实战篇 三、awk 文本处理工具基础篇实战篇 四、附xargsuniq & sort基础篇实战篇 cut 零、预 bash 的命令行展开 {} $ echo file_{1..4} file_1 file_2 file_3 file_4$ echo file_{a..d} file_…

【项目技术介绍篇】若依管理系统功能介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

如何去为快消品做商业模式——循环购模式给你答案!

大家好&#xff0c;我是吴军&#xff0c;来自一家专注于软件开发与商业模式创新的公司。 我们公司的主要业务是开发商城系统&#xff0c;以及为客户量身打造独特的商业模式。至今&#xff0c;我们已经成功创造了超过两百种各具特色的商业模式。 今天&#xff0c;我想为大家介绍…

v3-admin-vite 改造自动路由,view页面自解释Meta

需求 v3-admin-vite是一款不错的后端管理模板&#xff0c;主要是pany一直都在维护&#xff0c;最近将后台管理也进行了升级&#xff0c;顺便完成一直没时间解决的小痛痒&#xff1a; 在不使用后端动态管理的情况下。我不希望单独维护一份路由定义&#xff0c;我希望页面是自解…

Git命令上传本地项目至github

记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库&#xff0c;用于一会儿链接项目文件&#xff0c;按照自己的需求设置name和是否private 2.push an exis…

【LeetCode】LeetCode 547. 省份数量(Java版 什么是并查集)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、题目描述 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直…

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理&#xff08;提问&#xff09;技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接&#xff1a; Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测&#xff1a;NL…

如何使用Windows电脑部署Lychee私有图床网站并实现无公网IP远程管理本地图片

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-MSVdVLkQMnY9Y2HW {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

HarmonyOS ArkTS 骨架屏加载显示(二十五)

目录 前言1、骨架屏代码显示2、代码中引用3、效果图展示 前言 所谓骨架屏&#xff0c;就是在页面进行耗时加载时&#xff0c;先展示的等待 UI, 以告知用户程序目前正在运行&#xff0c;稍等即可。 等待的UI大部分是 loading 转圈的弹窗&#xff0c;有的是自己风格的小动画。其实…

《QDebug 2024年3月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 ApplicationWindow 不能使用父组件 Window 的 transientParent 属性 ApplicationWindow 使用 transientParent 报错&#xff1a; "ApplicationWindow.transientParent" is not available due to compone…

亚马逊自养号测评:风险剖析与防范策略全解析

亚马逊平台竞争激烈&#xff0c;美站乃至全球市场的卖家为提升产品排名和销量&#xff0c;纷纷用起了自养号测评。然而&#xff0c;自养号测评技术因其较高的技术门槛&#xff0c;使得许多卖家因缺乏对其原理和底层环境搭建的了解&#xff0c;而面临账号关联和封禁的风险。本文…

SpringBoot常见注解有哪些

Spring Boot的核心注解是SpringBootApplication , 他由几个注解组成 : ● SpringBootConfiguration&#xff1a; 组合了- Configuration注解&#xff0c;实现配置文件的功能&#xff1b; ● EnableAutoConfiguration&#xff1a;打开自动配置的功能&#xff0c;也可以关闭某个自…

实景三维技术:开启自然资源管理的新篇章

随着科技的不断进步&#xff0c;实景三维技术已经在多个领域得到了广泛的应用。而在自然资源管理领域&#xff0c;实景三维技术更是发挥着越来越重要的作用。本文将介绍实景三维在自然资源管理领域的应用&#xff0c;探讨其带来的优势和变革。一、什么是实景三维技术&#xff1…

Python多任务处理---多线程

引入 生活中&#xff0c;我们在电脑上打开了一个word, 这个word对操作系统来说就是一个进程。我们在进行word操作的时候&#xff0c;比如在你打字的时候&#xff0c;该word同时可以进行文字检查。发现了没&#xff0c;在同一个进程中&#xff0c;我们也可以进行同时操作。…

Rust 02.控制、引用、切片Slice、智能指针

1.控制流 //rust通过所有权机制来管理内存&#xff0c;编译器在编译就会根据所有权规则对内存的使用进行 //堆和栈 //编译的时候数据的类型大小是固定的&#xff0c;就是分配在栈上的 //编译的时候数据类型大小不固定&#xff0c;就是分配堆上的 fn main() {let x: i32 1;{le…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…

书生·浦语大模型-第一节课笔记

视频总结 23年发布的模型在一些材料中归位指令微调模型&#xff0c;后面逐渐升级应该已经是train的模型了 技术报告总结 InternLM2 Technical Report 评测与特点 6 dimensions and 30 benchmarks, long-context modeling, and open-ended subjective evaluations长文本…