【数据库】详解MySQL数据库中的事务与锁

目录

1.数据库事务

1.1.事务的四大特性

1.2.事务开启的方式

1.3.读一致性问题及其解决

2.MVCC解决读一致性问题原理

2.1.MVCC概念

2.2.准备环境

3.MySQL中的锁

3.1.行锁之共享锁

3.2.行锁之排它锁


1.数据库事务

数据库事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,这一组数据库命令要么全部执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元

在数据库系统上执行并发操作时,事务是作为最小的控制单元来使用的,特别适用于多用户同时操作的数据库系统,如转账

1.1.事务的四大特性

ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

(1) 原子性

事务是一个完整的操作。事务的各元素是不可分的。事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败

以银行转账事务为例,如果该事务提交了,则这两个账户的数据将会更新。如果由于某种原因,事务在成功更新这两个账户之前终止了,则不会更新这两个账户的余额,并且会撤销对任何账户余额的修改,事务不能部分提交

(2) 一致性

当事务完成时,数据必须处于一致状态。也就是说,在事务开始之前,数据库中存储的数据处于一致状态。在正在进行的事务中. 数据可能处于不一致的状态,如数据可能有部分被修改。然而,当事务成功完成时,数据必须再次回到已知的一致状态。通过事务对数据所做的修改不能损坏数据,或者说事务不能使数据存储处于不稳定的状态

以银行转账事务为例。在事务开始之前,所有账户余额的总额处于一致状态。在事务进行的过程中,一个账户余额减少了,而另一个账户余额尚未修改。因此,所有账户余额的总额处于不一致状态。事务完成以后,账户余额的总额再次恢复到一致状态

(3) 隔离性

对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

另外,当事务修改数据时,如果任何其他进程正在同时使用相同的数据,则直到该事务成功提交之后,对数据的修改才能生效。张三和李四之间的转账与王五和赵二之间的转账,永远是相互独立的

(4) 持久性

一个事务成功完成之后,它对数据库所作的改变是永久性的,即使系统出现故障也是如此。也就是说,一旦事务被提交,事务对数据所做的任何变动都会被永久地保留在数据库中

事务的 ACID 原则保证了一个事务要么成功提交,要么失败回滚。因此,它对事务的修改具有可恢复性。即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态

1.2.事务开启的方式

查看事务自动提交是否开启

SHOW VARIABLES LIKE 'autocommit';

设置事务自动提交

SET SESSION autocommit = on;

事务结束的三种方式

commit、rollback、断开客户端链接

1.3.读一致性问题及其解决

原子性:事务具有回滚的能力,InnoDB引擎使用undo log日志表来进行回滚操作

持久性:InnoDB引擎使用redo log日志表来保证数据的持久性

事务的隔离性产生的问题:

脏读:一个事务读取到了另一个事务未提交的数据

不可重复读:一个事务读取到了另一个事务已提交的数据,在同一个事务内不管进行多少次查询,查询到的结果总是相同的

幻读(虚读):一个事务读取了另一个事务提交的新增数据

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

MySQL数据库的隔离级别:

  1. Read Uncommitted (未提交读):未解决任何并发问题,事务未提交的数据对其他事务也是可见的,会出现脏读

  2. Read Committed (已提交读):解决脏读问题,一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读

  3. Repeatable Read (可重复读):解决不可重复读问题,在同一个事务中多次读取同样的数据结果是一样的, 这种隔离级别未定义解决幻读的问题

  4. Serializable (串行化):解决所有问题,最高的隔离级别,通过强制事务的串行执行

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

如果要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,实现事务隔离,应该怎样做?

方法一:在读取数据前对其加锁,阻止其他事务对数据进行修改

(LBCC)Lock Based Concurrency Control

方法二:生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取

(MVCC)Multi Version Concurrency Control,MVCC只在RC、RR中使用

2.MVCC解决读一致性问题原理

环境:MySQL数据,InnoDB存储引擎、Repeatable Read(可重复读)隔离级别

2.1.MVCC概念

(MVCC)Multi Version Concurrency Control。MVCC只在Read Committed (已提交读)和Repeatable Read(可重复读)中使用

MVCC是一种并发控制的方法,一般在数据库管理系统中实现对数据库的并发访问,在编程语言中实现事务内存

如果有人从数据库中读数据的同时,有另外的人写入数据,有可能读数据的人会看到“半写”或者不一致的数据。有很多种方法来解决这个问题,叫做并发控制方法。最简单的方法,通过加锁,让所有的读者等待写者工作完成,但是这样效率会很低。MVCC使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写者写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他的读者来说是不可见的

当一个MVCC数据库需要更改一条数据记录的时候,它不会直接用新数据覆盖旧数据,而是将旧数据标记为过时(obsolete)并在别处增加新版本的数据。这样就会有存储多个版本的数据,但是只有一个是最新的。这种方式允许读者读取在他读之前已经存在的数据,即使这些在读的过程中半路被别人修改、删除了,也对先前正在读的用户没有影响。这种多版本的方式避免了填充删除操作在内存和磁盘存储结构造成的空洞的开销,但是需要系统周期性整理(sweep through)以删除过时的数据

MVCC提供了时点(point in time)一致性视图。MVCC并发控制下的读事务一般使用时间戳或者事务ID去标记当前读的数据库的状态(版本),读取这个版本的数据。读、写事务相互隔离,不需要加锁。读写并存的时候,写操作会根据目前数据库的状态,创建一个新版本,并发的读则依旧访问旧版本的数据。

一句话讲,MVCC用“同一份数据临时保留多版本”的方式,实现并发控制。

MySQL会在表中添加2个隐藏的字段,DB_TRX_ID(插入或者更新行的最后一个事务的ID)和DB_ROLL_PTR(回滚指针)。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。回滚指针用来查找历史版本的数据

2.2.准备环境

MVCC效果演示

创建表结构,添加数据

CREATE TABLE `t_mvcc` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建测试表

CREATE TABLE `t_mvcc_demo` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

3.MySQL中的锁

锁的概念:

锁是计算机协调多个进程或线程并发访问某一资源的机制

在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题,锁冲突是影响数据库并发访问性能的一个重要因素

MySQL中的锁:

MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制,比如:

MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking)

InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高

仅从锁的角度来说:表级锁更适合于以查询为主;行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用

总结:

锁定粒度:表锁>行锁

加锁效率:表锁>行锁

冲突概率:表锁>行锁

并发性能:表锁<行锁

3.1.行锁之共享锁

共享锁,又称为读锁,简称S锁

共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改

加锁:

select * from t_person_lock where id=1 LOCK IN SHARE MODE;

释放锁:事务结束后会释放锁

应用场景:例如现在有主表order_info,从表order_detail,现在正在修改order_detail表中的数据,但是不希望该数据对应的主表数据被修改,那么就可以在主表的数据上加共享锁,其他的事务就不能修改数据了

3.2.行锁之排它锁

排它锁又称写锁,简称X锁

排它锁不能与其它锁并存,如一个事务获取了某个数据行的排它锁,其他事务就不能再获取该行的锁,只有获取了排它锁的事务可以对数据行进行读取和修改

加锁:

自动:delete / update / insert默认加上X锁

手动:

select * from t_person_lock where id=1 FOR UPDATE;

释放锁:事务结束后会释放锁

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

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

相关文章

C语言文件操作

本文重点&#xff1a; 什么是文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 文件结束的判定 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一&#xff1a;libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

No.36 学习 | Python 函数:从基础到实战

最近我在学 Python 编程&#xff0c;今天可算是狠狠钻研了一把 Python 里的函数&#xff0c;感觉脑袋里的知识又充实了不少&#xff0c;赶紧来记一记。 一、Python函数基础概念 &#xff08;一&#xff09;pass语句&#xff1a;代码块的“占位符” 在编写代码时&#xff0c;有…

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

Qt 5.14.2 学习记录 —— 십유 布局管理器

文章目录 1、QVBoxLayout2、QHBoxLayout3、QGridLayout4、QFormLayout5、QSpacerItem 布局管理器是为了让程序员不需要自己决定控件的绝对位置&#xff0c;而是通过布局管理器方便地放置 1、QVBoxLayout 垂直布局管理器 #include <QPushButton> #include <QVBoxLayo…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器&#xff08;插件安装、插件配置、markdown语法&#xff09;_vscode markdown-CSDN博客 右键 .md 文件&#xff0c;选择打开 方式 &#xff08;安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

H3C-无线WLAN配置案例(二层隧道转发)

目录 1.无线wlan产生背景:2.网络拓扑:3.网络简述:4.网络配置:4.1 网络基础配置4.2 无线wlan二层隧道转发配置4.3 无线wlan验证: 1.无线wlan产生背景: 无线WLAN&#xff08;无线局域网&#xff09;的产生背景主要源于以下几个方面的需求和技术发展&#xff1a;移动性和便捷性需…

HarmonyOS Next构建工具 lycium 原理介绍

HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供&#xff0c;如果要使用C接口&#xff0c;必须要使用NAPI在ArkTS与C间交互&#xff0c;这种场景在使用DevEco-Studio中集成的交叉编译工具&#xff0c;以及cmake构建工具就完全够用…

设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解职责链模式 最常见的职责链是直线型&#xff0c;即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者&#xff0c;职责链模式可以将请求的处理者组织成一条链&#xff0c;并让请求沿着…

js学习笔记(2)

一、函数 1.JavaScript 函数语法 函数就是包裹在花括号中的代码块&#xff0c;前面使用了关键词 function&#xff1a; function functionname() {// 执行代码 } 当调用该函数时&#xff0c;会执行函数内的代码。 可以在某事件发生时直接调用函数&#xff08;比如当用户点…

洛谷刷题1-3

比较巧妙&#xff0c;求最小公倍数&#xff0c;看多少个数一次循环&#xff0c;直接求解就好了&#xff0c;N的数量级比较大&#xff0c;一层循环也会超时&#xff0c;也用了点双指针的想法&#xff08;归并排序&#xff09; 这里很大的问题&#xff0c;主要是cin输入的时候遇到…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

每天五分钟深度学习pytorch:基于VGG神经网络完成CAFIR10的识别

本文重点 前面的所有模型我们都是使用VGG跑了mnist数据集,本次我们换一个数据集,我们使用CAFIR数据集,这个数据集我们前面介绍过,它和mnist不一样了,mnist是灰度图,这个是彩色图,所以它的通道数是3,这样我们再构建卷积神经网路的时候,第一个卷积层的输入通道数就应该…

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…