【MySQL】 隔离级别和锁机制

事务的四种特性

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

  • 原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
  • 一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
  • 隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

隔离级别以及其产生的问题

越往后隔离级别越高

  • READ UNCOMMITTED 读取未提交

在这个隔离级别,所有的事务都可以“看到”未提交事务的执行结果。在这种级别上,可能产生很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。这种隔离级别很少用户实际应用,因为他的性能并不比其他性能好,而其他隔离界别有很多的优点,也被称之为脏读。

  • READ COMMIT 读取提交

大多数数据库系统的默认隔离级别(不是Mysql的默认隔离级别),满足了隔离的早先简单定义:一个书屋开始时,只能“看见”已经提交的事务所有的改变,一个书屋从开始到提交前,所做的任何数据该病都是不可见的,除非已经提交。这种隔离界别也支持所谓的“不可重复读”。这意味着用户运行同一个语句两次,看到的结果是不同的。

  • REPEATABLE READ 可重复读

MySql的默认隔离级别。解决了READ UNCOMMITTED隔离级别导致的问题。保证同一事务的多个实例在兵法读取事务时,会“看到同样的”数据行。不过这会导致另一个棘手的问题“幻读”。InnoDB和FaIcon存储引擎通过多版本并发控制机制(MVCC,Multiversion Concurrency Control)机解决了幻读问题。

  • SERIVLIZABLE 可序列化

最高的隔离级别。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。就是说他是每个读取的数据行加锁。可能导致大量的超时Timeout和锁竞争Lock Cotention现象,实际应用中很少使用这个级别,如果为了数据的稳定性,需要强制减少并发,也可以选择这个级别。

脏读
指的是一个事务读取到了未提交事务执行过程中的数据。
例如:线程A将余额100变成200,但是由于还要扣费没有执行结束,但是线程B已经看到了这200的余额,这就产生了脏读。即读取的数据并不一定是最后的结果数据,可能是过程数据。

不可重复读
指的是数据库中的某个数据,一个事务多次查询返回了不同的查询结果。原因是在事务的执行过程中,数据被其他数据修改。
例如:与A恰恰相反,事务两次查询执行到了不同的结果。

幻读
幻读是事务非独立执行时发生的一种现象。
例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

隔离级别脏读不可重复读幻读
read uncommitted
read committed
repeatable read
serializable

  • 基于锁的属性分类:共享锁(share lock),排他锁(exclusive lock)
    • 共享锁

      共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
      如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

    • 排它锁

      排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

  • 基于锁的粒度分类:行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb)
    • 行级锁:用于单独锁定表中的一行
    • 表级锁:

      表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。被大部分的mysql引擎支持,MyISAM和InnoDB都支持表级锁,但是InnoDB默认的是行级锁。

    • 页级锁:8 千字节 (KB) 的数据页或索引页

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

  • 基于锁的状态分为: 意向共享锁、意向排他锁
    • 意向共享锁:表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁
    • 意向排他锁:类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁
  • 基于业务类型区分
    • 乐观锁:完全依靠数据库来管理锁的工作。
    • 悲观锁:程序员自己管理数据或对象上的锁处理。

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

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

相关文章

redis-集群 原生部署和工具自动部署

什么redis集群? redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务,而是会提供多个master节点来提供写服务,每个master节点中存储的数据都不一样,这些数据…

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接,至于代码美不美观,写的好不好,统统不考虑,我只能说,能跑就不错了,上学压根没学过python好吧,基本上是crtlc&ctrlv丝滑小…

开启AI绘画新纪元:让创意在指尖绽放

文章目录 一、了解AI绘画的基本原理二、选择合适的AI绘画工具三、掌握AI绘画的基本技巧四、借鉴与创新:从模仿到创作五、参与社区交流,共同成长《AI绘画教程:Midjourney使用方法与技巧从入门到精通》亮点推荐内容简介作者简介目录 在科技日新…

Linux centos 常用的网络负载和网速查看工具和命令

在 CentOS 上查看网络速度和网络负载,可以使用多种工具,以下是一些常用的命令行工具: iftop - 用于实时监视网络带宽使用情况。 安装命令: sudo yum install iftop 使用命令: sudo iftop nload - 一个简单的控制…

Doris-数据分区

数据分区:即将大表划分为小表,数据分区主要有两个级别:Partition和Bucket(Tablet)。 Partition:逻辑分区,按照一定规则将表按照行进行划分,每个部分就是一个Partition。 Bucket&…

【面试题】Rocketmq面试题总结

为什么使用消息队列(如RocketMQ)? 异步处理:解耦系统间调用,提高响应速度。解耦:降低模块间的直接依赖,使系统更易于扩展和维护。流量削峰:在高峰期将请求暂时存储起来,…

flink重温笔记(十):Flink 高级 API 开发——flink 四大基石之 State(涉及Checkpoint)

Flink学习笔记 前言:今天是学习 flink 的第 10 天啦!学习了 flink 四大基石之 State (状态),主要是解决大数据领域增量计算的效果,能够保存已经计算过的结果数据状态!重点学习了 state 的类型划…

相对于 Linux,Windows Server 存在的意义是什么?

相对于 Linux,Windows Server 存在的意义是什么? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给…

【LeetCode】389_找不同_C

题目描述 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 https://leetcode.cn/problems/find-the-difference/description/ 示例 示例 1: 输…

新版AndroidStudio的Gradle窗口显示task list not built 问题解决

在使用新版AndroidStudio时,会出现,Task List not built 的问题。如果你记得task的名字,当然可以 直接通过命令 gradle taskname 或者 ./gradlew taskName直接执行即可,但是若是记不住,还是把这个任务构建处理比较好用…

借助工具优化开发流程,提升开发体验

背景 最近在做一个demo,只有一个html页面,需要开启一个https web server,以此来实现在浏览器中访问。 改造前 改造前,每次修改文件保存后都要刷新一下浏览器。 如果只是短时间,每次修改后手动刷新浏览器也还行。主要…

C++:Stack和Queue的模拟实现

创作不易,感谢三连! 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 就如同是电源适配器将不适用的交流电…

用不了google翻译怎么办?

如果无法使用谷歌翻译,你可以尝试以下方法: 寻找替代服务:可以搜索并了解其他翻译服务,如百度翻译、有道翻译等。这些服务通常提供免费或低价的翻译服务,以满足日常需求。使用本地翻译工具:在某些国家和地…

2k_Day1:今天是设计模式的大白话1

大白话: 原则有一点很难做到,就是定义好的类,只能加不能改(开放-关闭原则) 1.工厂模式就是,比如你定了一个汽车接口,然后小车、中车、大车都继承这个接口,这时,定一个汽…

在明确自己已经下载好了依赖库,但Vue3引用第三方模块报错Could not find a declaration file for module ***

在 Vue 3 TypeScript 项目中,引入第三方库时,有时会遇到该模块无定义文件的问题。通常,我们可以尝试以下两种方式解决: 方法 1: 使用 require 语句 在 TypeScript 文件中,使用 require 语句来代替 import 语句,例如…

day04-Maven

一、初识 Maven Maven 是 Apache 旗下的一个开源项目,是一款用于管理和构建 java 项目的工具。 官网:https://maven.apache.org/ Maven的作用 依赖管理(方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题)统一项目…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及,群控软件的需求日益增加,特别是针对苹果设备的群控软件,因其出色的性能和广泛的用户基础,受到了开发者们的青睐。 然而,开发一款功能强大的苹果群控软件并非易事,需要深入了解苹果的开…

获取C语言语句对应的汇编码和机器指令

借助IDE的调试功能 以CodeBlocks为例,先设置断点,然后点击红色三角形调试。 然后选择Debug➡ Debugging Windows➡Disassembly 就可以看到了 使用命令行 在工程文件中,一般可以找到一个.o文件。如果没有,可以先在program.c的目录下…

掌握java中继承

目录 1.概念: 2.使用: 3.super关键字 4.子类构造方法 5.super和this关键字 6.初始化时代码块的执行顺序 7.继承的方式 8.final关键字 1.概念: 是面向对象程序设计代码可以重复使用的重要手段,允许程序员在保持原有类特性的…

git入门到精通

第3章 Git常用命令 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地 状态 3.3.1 首次查看(工作区没有任何文件) 3.3.2 新增文件(hello.txt) 3.3.3 再次查者(检測到末追踪的文件) 3.4添加暫存区 3…