首页 > 数据库 >mysql 行级锁,四种事务隔离级别,两种读

mysql 行级锁,四种事务隔离级别,两种读

时间:2024-10-23 19:48:01浏览次数:5  
标签:行级 事务 快照 读取 读锁 mysql 数据 四种 隔离

只说innodb存储引擎

1. 默认使用行级锁

InnoDB 存储引擎默认使用行级锁定(Row-Level Locking)来提高并发性能和数据一致性

不可更改

2. 四种事务隔离级别,默认是Repeatable级别(可重复读)

问题场景:

  1. 脏读

1.A进行了一条数据操作,但是没有提交事务,如果此时B进行这条数据的查询,是可以查到A的数据操作结果的。
2.后来A还没有提交事务,反而不提交了或者进行了事务回滚,那么B查询到的数据就是脏数据。

  1. 不可重复读(侧重于修改)

事务A多次读取到同一个数据,而B在A多次读取的过程中,对数据进行了修改,导致事务A多次多去同一个数据的时候,结果不一致。

  1. 幻读(侧重于增加或者删除)

再一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读。而多或者少的那一行数据叫做幻行。

事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。
隔离级别  脏读   可重复读     幻读
读未提交  可能      可能      可能
读提交    不可能    可能      可能
可重复读  不可能    不可能    可能
串行化    不可能    不可能    不可能

从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定

解决原理:

可重复读

读锁和写锁会持有到事务结束,但是不加范围锁。可重复度解决的问题是不可重复读,不能解决的问题是幻读

读已提交

写锁会持有到事务结束,读锁在查询之后就会释放掉,没有范围锁。它解决的问题是脏读,不能解决的问题是不可重复读

 

举例:可重复读是如何解决不可重复读问题的?

可重RR隔离级别下,分为快照读和当前读,快照读不加锁,锁定已存在的行

当前读 读锁和写锁会持有到事务结束(全程加锁),但是不加范围锁。此时可以解决不可重复度,但存在幻读

幻读问题:因为默认是行级锁,锁上的行不可修改,但表中可能会insert数据,(快照读只锁定已存在的行,而不锁定可能插入的新行)

当使用如:select count(*) from t_student where age < 20  查询时,发生幻读

 

其他知识:

mysql中InnoDB支持下面的几种锁

  1. 共享锁和排他锁(s锁和x锁)
  2. 意向锁
  3. 记录锁
  4. 范围锁(gap锁)
  5. next-key锁
  6. 插入意向锁
  7. auto-inc锁
  8. 专门给空间索引锁

这些锁都是InnoDB中支持的,也不是本文的重点,现代数据库基本提供了下面的三种类型锁

  1. 写锁(独占锁)

    持有写锁,持有写锁的事务才可以对数据操作,数据有写锁的时候,别的事务不能写入数据,也不能添加读锁。

  2. 读锁(共享锁)

    共享锁,持有读锁的事务可以同时访问数据(数据可以持有多个读锁),数据添加读锁之后不能再添加写锁(读写互斥)。对于持有读锁的数据,如果只有一个事务,读锁是可以升级为写锁,写入数据。

  3. 范围锁

    对于某个范围直接添加排他锁,在这个范围里面的数据是不能被写入的。比如:

    select * from t_student where age > 12 and age < 30 for update

 

设置隔离级别:

-- 设置当前会话的隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置全局的隔离级别为读已提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
LEVEL 可选 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE


3.

快照读(Snapshot Read)

  • 定义:快照读是指事务读取的是某个时间点的一致性视图(快照),而不是最新的数据。
  • 特点
    • 读取的是事务开始时或某个特定时间点的数据快照。
    • 不会对读取的数据加锁,因此不会阻塞其他事务的读写操作。
    • 主要在 REPEATABLE READ 和 READ COMMITTED 隔离级别下使用。
  • 实现:InnoDB 使用多版本并发控制(MVCC)来实现快照读。每个事务在开始时会获得一个事务ID(transaction ID),并根据这个ID读取相应版本的数据。
  • 示例: sql 深色版本
    SELECT * FROM orders WHERE customer_id = 100;

当前读(Current Read)

  • 定义:当前读是指事务读取的是最新的数据,而不是某个时间点的快照。
  • 特点
    • 读取的是最新的、已提交的数据。
    • 会对读取的数据加锁,以防止其他事务修改这些数据。
    • 主要在 REPEATABLE READ 和 SERIALIZABLE 隔离级别下使用。
  • 实现:InnoDB 使用锁机制来实现当前读。常见的当前读操作包括 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEINSERTUPDATE 和 DELETE
  • 示例: sql 深色版本
    SELECT * FROM orders WHERE customer_id = 100 FOR UPDATE;

区别

  1. 读取的数据版本

    • 快照读:读取的是事务开始时或某个特定时间点的数据快照。
    • 当前读:读取的是最新的、已提交的数据。
  2. 锁机制

    • 快照读:不加锁,允许多个事务并发读取同一数据。
    • 当前读:加锁,防止其他事务修改正在读取的数据。
  3. 并发性能

    • 快照读:并发性能较高,因为不加锁,允许多个事务并发读取。
    • 当前读:并发性能较低,因为加锁会阻塞其他事务的读写操作。
  4. 适用场景

    • 快照读:适用于需要读取历史数据或一致性视图的场景,如报表生成、数据分析等。
    • 当前读:适用于需要读取最新数据并进行修改的场景,如库存管理、银行转账等

 

标签:行级,事务,快照,读取,读锁,mysql,数据,四种,隔离
From: https://www.cnblogs.com/light-LifeClub/p/18498229

相关文章

  • [MySQL笔记]窗口函数
    什么是窗口函数窗口函数(WindowFunction),又被叫做分析函数(AnalyticsFunction)。窗口函数允许用户在不显式分组查询的情况下对结果集进行分组和聚合计算。窗口函数能够为结果集中的每一行计算类似排名、行号、百分比和移动聚合函数等值。窗口函数原则上只能写在select子句中......
  • MySQL 存储引擎
    一、MySQL架构连接层         最上层是一些客户端和连接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为每个安全接入的用户端验证它所具有的操作权限。服务层         第二层架构主要完成大多数的核心服务功能,如SQL接口,并......
  • 如何将MySQL数据集成到金蝶云星空以实现生产领料单新增
    MySQL数据集成到金蝶云星空:SLD生产领料单新增深圳天一-单工序-好在企业信息化系统中,数据的高效流转和准确对接是业务运作的关键。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将MySQL中的数据无缝集成到金蝶云星空,实现SLD生产领料单新增深圳天一-单工序-好的任......
  • mysql中将一行数据根据条件分拆多行
    以下用法只支持mysql8.0以上;遇到了个数据结构,字符串用逗号隔开的,需要分拆后统计数据,用到了mysql8的一个JSON_TABLE用法CREATETABLEitems(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255),tagsVARCHAR(255));INSERTINTOitems(name,tags)VALUES......
  • kubesphere搭建nacos2.2.3(MySQL)
    环境准备创建nacos数据库,sql来自于nacos官网,自行查找并执行启动环境配置如图具体配置如下具体含义请参考nacos官网#***************SpringBootRelatedConfigurations***************####Defaultwebcontextpath:server.servlet.contextPath=/nacos###Inc......
  • 高效集成:旺店通旗舰版与MySQL的数据对接方案
    旺店通旗舰版-其他入库单-->BI泰海-其他入库单表_原始查询(2024年起)数据集成方案在现代企业的数据管理中,如何高效、可靠地实现系统间的数据对接是一个关键挑战。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将旺店通·旗舰奇门的数据无缝集成到MySQL数据库中。......
  • MySQL 回收表碎片实践教程
    前言:在MySQL数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。查看表碎片大小一般MySQL数据库都是开启i......
  • docker安装mysql
    本次分享docker安装mysql,没有废话,绝对全网最简单首先你需要已经安装过docker,在这里默认已安装过docker。安装mysql命令:dockerrun--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7--lower_case_table_names=1其中密码和mysql版本可自己改然后......
  • 一文彻底搞定Redis与MySQL的数据同步
    Redis和MySQL一致性问题是企业级应用中常见的挑战之一,特别是在高并发、高可用的场景下。由于Redis是内存型数据库,具备极高的读写速度,而MySQL作为持久化数据库,通常用于数据的可靠存储,如何保证两者数据的一致性需要具体业务场景的设计与优化。下面我们将结合几个典型的业务......
  • linux 一键部署mysql 8.4.2 绿色版
    亲测有效vimdeploy_mysql.sh#!/bin/bash#mysql安装目录是${wget_path}/${mysql_dir}#修改mysql的登录密码updatePassword="sykj@2024"wget_path="/data"mysql_dir="mysql"#.tar.xz文件mysql_dowmload_path="https://downloads.mysql.com/......