MySQL事务隔离级别、锁机制、三大范式

news2024/12/24 9:43:23

目录

一、事务

1.概念

2.事务的特性

3.并发带来的问题

4.事务的隔离级别

 二、锁机制

1.什么是锁

2.MySQL锁分类

3.乐观悲观锁

4.共享排它锁

5.意向锁

6.粒度锁

三、三大范式

1.第一范式

2.第二范式

3.第三范式


一、事务

1.概念

事务是逻辑上的一组操作,要么全执行,要么全不执行。

事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这两个操作之间突然出现错误,导致小明余额减少但是小红余额没有增加,这种情况是肯定不允许的。事务就是保证这两个关键操作要么都成功,要么都不成功。

2.事务的特性

①原子性

是事务的最小执行单位,不允许再分割。

②一致性

执行事务前后,数据保持一致。

③隔离性

并发访问数据库时,一个用户的事务不应该被其他事务影响,所有并发事务之间数据库是独立的。

④持久性

事务的提交对数据库数据的修改是永久的,即使数据库发生故障也不应该对其有所影响。

3.并发带来的问题

①脏读

当一个事务正在访问数据库时,并对数据进行了修改,但是事务还没有提交。这是另一个事务访问数据库时读取的数据就是“脏数据”。

②修改丢失

当两个事务同时访问同一个数据时,第一个事务将数据进行了修改,另一个事务也将读取到的数据进行修改,第一个事务做出的修改结果就会被丢失。

eg:一个数据为20,两个事务同时读取并做出修改(20-1),两个事务执行完的结果都为19,理想的结果应为依次减一,结果应为18.

③不可重复读

当一个事务需要频繁读取一个数据,在未提交时另一个事务读取数据并做出修改,那么第一个事务前后读取的结果就不一致,有可能造成结果错误。

④幻读

当一个事务读取数据库的5行数据时,在未提交的过程中另一个事务向这五行中新插入了一行新数据,那么第一个事务再次读取时数据发生了变化。

4.事务的隔离级别

①读未提交

最低的隔离级别,允许读取尚未提交的数据变更。脏读是在一个事务未提交时另一个事务读取发生的错误,所以不能避免。读未提交并不能避免不可重复读和幻读。

②读已提交

允许读取并发事务已经提交的数据,可以避免脏读,仍然不能解决不可重复读和幻读的问题。

③不可重复读

对同一个字段多次读取的结果都是一致的,除非本身事务发生了修改。可以避免脏读和不可重复读。

④可串行化

最高的隔离级别,完全服从ACID的隔离级别,所有事务依次执行,可以避免脏读、不可重复读、幻读。

 二、锁机制

1.什么是锁

锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制,解决并发事务的访问问题。

当一个事务进行读操作,另一个事务进行写操作,为了避免并发出现的问题,可以给读写操作都加锁。

2.MySQL锁分类

3.乐观悲观锁

3.1乐观锁

假设不会发生并发冲突,只在提交时检查是否违反了数据完整性,在修改数据时把事务锁起来通过版本控制的方式进行锁定。

3.2悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,在查询完数据后就把事务锁起来,直到提交事务。

4.共享排它锁

4.1共享锁(读锁/S锁)

允许多个事务同时读取一张表,但是不能进行写操作。如果一个事务持有共享锁,其他事务也能持有共享锁,共享锁之间不会互相阻塞。

4.2排它锁(写锁/X锁)

只允许一个事务进行写操作,其他事务不能进行读取和写入操作。如果一个事务持有排它锁,其他事务无法获取共享锁和排它锁,排它锁会阻塞其他事务的读写操作。

5.意向锁

5.1意向共享锁(IS锁)

事务有意向对表中的某些记录加共享锁(S锁),加共享锁之前必须获取该表的IS锁。

5.2意向排它锁(IX锁)

事务有意向对表中的某些记录加排他锁(X锁),加排他锁之前必须获取该表的IX锁。

5.3兼容性

6.粒度锁

6.1全局锁
全局锁,从名称上可以理解,全局锁就是对整个 MySQL 数据库实例加锁,加锁期间,对数据库的任何增删改操作都无法执行,会阻塞所有对数据库的操作。

全库数据备份,可以使用全局锁,其他情况不要使用

MySQL 全局读锁的命令是Flush tables with read lock; (FTWRL)

6.2 表级锁
给当前操作的这张表加锁, MyISAM 与 InnoDB 引擎都支持表级锁定

加表锁:lock table read/write

解除表锁:

①show processlist

②kill 掉锁表的进程

6.3 页级锁
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。

6.4 行级锁
行级锁是 MySQL 粒度最小的锁,发生锁冲突概率最低,但是加锁慢,开销大

MySQL 中只有 InnoDB 引擎支持行锁,其他不支持。

MySQL 在执行 update、delete 语句时会自动加上行锁。

7.快照读和当前读

7.1快照读

快照读就是读取的是快照数据,不加锁的简单 Select 都属于快照读。

SELECT * FROM STUDENT WHERE ...

7.2当前读

当前读就是读的是最新数据,而不是历史的数据。加锁的 SELECT,或者对数据进行增删改都会进行当前读。

三、三大范式

1.第一范式

要求任何一张表都有主键,并且每一个字段原子性不可再分。

不满足第一范式可能会造成的问题:①数据冗余②更新异常③插入异常④删除异常

例:
建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade)。假设用一个单一的关系模式Student来表示,则该关系模式的属性为:U={Sno, Sdept, Mname, Cno, Grade}
得到一个函数依赖F,F={Sno—>Sdept, Sdept—>Mname, (Sno, Cno)—>Grade}

 存在的问题:每一个系的系主任姓名、所属系的信息重复出现;某个系更换系主任后,必须修改与该系学生有关的每一个条记录;一个系刚成立,暂时没有学生,则无法把这个系以及系主任的信息存入数据库;某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及系主任的信息也删除了。

2.第二范式

建立在第一范式的基础上,要求所有非主键字段对主键是完全依赖,不存在部分依赖。

不满足第二范式可能造成的问题:①插入异常②删除异常③修改重复

例:
有关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade),分别是学生的学号(Sno)、所在系(Sdept)、学生的住处(Sloc)、课程号(Cno)、课程成绩(Grade),并且每个系的学生都住在同一个地方。S-L-C的主键是(Sno, Cno),则函数依赖有:
(Sno, Cno)—>Grade
Sno—>Sdept, (Sno, Cno)—>Sdept
Sno—>Sloc, (Sno, Cno)—>Sloc
Sdept—>Sloc(每个系的学生只住在一个地方)
可以看到非主键字段Sdept、Sloc并不完全依赖于主键,则S-L-C(Sno, Sdept, Sloc, Cno, Grade)不符合第二范式定义。

3.第三范式

建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不存在传递依赖。

 

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

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

相关文章

XXL-JOB任务调度平台的安装使用教程(保姆级教程)

首先从GitHub上面将项目clone下来。 GitHub地址:https://gitee.com/xuxueli0323/xxl-job.git 下载好之后,然后通过IDEA打开,将Maven编译好后项目结构如下 在数据库中运行这个SQL文件 ,将基础表创建出来。就可以得到左边图中那些表…

P12-Retentive NetWork-RetNet挑战Transformer

论文地址:https://arxiv.org/abs/2307.08621 目录 Abstract 一.Introduction 二.Retentive Networks 2.1Retention 2.2Gated Multi-Scale Retention 2.3Overall Architecture of Retention Networks 2.4Relation to and Differences from Previous Methods 三.Experime…

并发编程的艺术-“程”:探索进程、线程、协程、纤程与管程

一、并发中的程 在计算机科学领域,处理多任务和并发执行是一项重要的挑战。为了解决这个问题,出现了多种并发模型和概念,包括进程、线程、协程、纤程和管程。本文将深入探讨这些并发概念,帮助读者理解它们的原理、特点和应用场景…

ABeam×Startup丨德硕管理咨询(深圳)创新研究团队前往灵境至维·既明科技进行拜访交流

近日,德硕管理咨询(深圳)(以下简称“ABeam-SZ”)创新研究团队一行前往灵境至维既明科技有限公司(以下简称“灵境至维”)进行拜访交流,探讨线上虚拟空间的商业模式。 现场合影 &…

PMP备考指南来啦!

第一步:通读教材,了解学习内容 在正式开始课程的学习前,可以先快速简单地阅览一遍教材(PMBOK),在较短的时间内知道自己将要学习的是什么内容;同时可以标记出难理解的知识点。这样做有以下两个好…

CHATGPT源码简介与使用指南

CHATGPT源码的基本介绍 CHATGPT源码备受关注,它是一款基于人工智能的聊天机器人,旨在帮助开发者快速搭建自己的聊天机器人,无需编写代码。下面是对CHATGPT搭建源码的详细介绍。 CHATGPT源码的构建和功能 CHATGPT源码是基于Google的自然语言…

【实用干货】3个技巧 - 教你怎么提取公众号封面图!

平时刷公众号的时候遇到自己喜欢的封面,怎么撸过来呢?小埋教大家几个比较实用的方法。 1.135编辑器提取 也是小埋酱经常用的工具,因为平时码字的时候是用的135,所以用起来比较方便,不光光是公众号、视频、音频、视频号…

【腾讯云 TDSQL-C Serverless 产品体验】 使用 Python 向 TDSQL-C 添加读取数据 实现词云图

文章目录 前言学到什么?准备工作申请TDSQL数据库1. 点击登录腾讯云2. 点击立即选购 ,如下图所示3. 选购页面中的数据库配置选项如下4. 基础信息5. 配置完成后点击 右下角的立即购买即可6. 点击立即购买后会有弹窗如下, 再次点击7. 购买完成后 , 会出现弹窗 , 点击前往管理页面…

SD卡相关资料

STM32429I-EVAL1 正点原子 ALIENTEK探索者STM32F4、ALIENTEK战舰STM32F1 V3 野火 野火STM32F103-V2霸道 中科蓝汛 AB5322B QFN32内部软开关蓝牙音箱

ppt怎么转pdf文件?这几种方法搞定

ppt怎么转pdf文件?将ppt转为pdf可以让你更方便地分享你的演示文稿,无论你的观众使用的是什么设备或操作系统,他们都可以轻松地查看你的演示文稿。此外,将ppt转为pdf还可以防止其他人修改你的文稿,保证了你的演示文稿的…

Vue-打印组件页面

场景: 需要将页面的局部信息打印出来&#xff0c;只在前端实现&#xff0c;不要占用后端的资源。经过百度经验&#xff0c;决定使用 print-js和html2canvas组件。 1. 下载包 npm install print-js --save npm install --save html2canvas 2. 组件内引用 <script>impo…

解决 Mac 上使用 Electron Updater 更新 App 不成功的问题!!!

文章目录 1. 现象2. 分析并如何解决3. 后续 1. 现象 在Mac电脑上&#xff0c;使用Electron Updater对程序进行更新&#xff0c;但是一直不成功&#xff0c;也不报错。具体表现是这样的&#xff1a;当前我的程序版本是3.11版本&#xff0c;点击更新之后&#xff0c;也下载了&am…

16.2.3 【Linux】离线管理问题

要注意的是&#xff0c;我们在工作管理当中提到的“背景”指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境&#xff0c; 你可以说那个是 bash 的背景&#xff0c;并不是放到系统的背景去。所以&#xff0c;工作管理的背景依旧与终端机有关。在这样的情况下&#xff0c;如…

近期关于开展微信小程序备案的通知,西米支付来教大家微信小程序如何备案

微信小程序备案步骤&#xff1a; 登录微信公众平台&#xff1a; 使用你的微信公众号管理员账号登录微信公众平台。 选择小程序管理&#xff1a; 在左侧菜单中选择“小程序”进行管理。 进入小程序设置&#xff1a; 选择你要备案的小程序&#xff0c;进入小程序管理页面。 填…

Hyper-V 虚拟机网络慢的原因及解决方案参考

Hyper-V VM 上的网络性能不佳 有几次我遇到过这样一种情况&#xff0c;即从运行Windows Server 的Hyper-V主机上的虚拟机复制文件的速度要慢得多。在本文中&#xff0c;我尝试描述几种不同的方法来提高在Windows Server &#xff08;以及最新的Windows 10和11版本&#xff09;上…

S7-200 SMART 通信端口以及连接方式

每个S7-200 SMART CPU都提供一个以太网端口和一个RS485端口(端口0)&#xff0c;标准型CPU额外支持SB CM01信号板(端口1)&#xff0c;信号板可通过STEP 7-Micro/WIN SMART软件组态为RS232通信端口或RS485通信端口。 CPU 通信端口引脚分配 1.S7-200 SMART CPU 集成的 RS485 通信…

seata server 1.6版本安装及配置

文章目录 下载安装并启动数据库导入数据库修改配置文件 服务注册配置中心手动添加脚本导入 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Seata 是一款开源的分布式事务解决方案&#…

QT报表Limereport v1.5.35编译及使用

1、编译说明 下载后QT CREATER中打开limereport.pro然后直接编译就可以了。编译后结果如下图&#xff1a; 一次编译可以得到库文件和DEMO执行程序。 2、使用说明 拷贝如下图编译后的lib目录到自己的工程目录中。 release版本的重新命名为librelease. PRO文件中配置 QT …

c语言每日一练(7)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

Oracle常用基础知识

整体介绍 SQL语言是一种数据库语言 1、DDL&#xff1a;数据定义语言 create-创建 drop-删除 alter-修改 rename-重命名 truncate-截断 2、DML&#xff1a;数据操作语句 insert-插入 delete-删除 update-更新 select-查询 3、DCL&#xff1a;数据控制语句 grant-授权 rev…