返回顶部
首页 > 资讯 > 数据库 >事务隔离级别、锁、索引、存储引擎
  • 253
分享到

事务隔离级别、锁、索引、存储引擎

事务隔离级别索引存储引擎 2021-12-21 14:12:57 253人浏览 绘本
摘要

1.隔离级别 1.1未提交读(read uncommit) RU 这是最低级别的隔离等级: 在这种隔离级别下,可以读取未提交的事务修改/更新到的数据,基本无数据库会选择该隔离级别 事务一  select * fro

事务隔离级别、锁、索引、存储引擎

1.隔离级别

1.1未提交读(read uncommit) RU

这是最低级别的隔离等级

在这种隔离级别下,可以读取未提交的事务修改/更新到的数据,基本无数据库会选择该隔离级别

事务一 


select * from 表A where id = 1 读取到 name = 张三

事务二


update 表A set name = "李四" where id = 2

事务一


select * from 表A where id = 1 读取到 name = 李四

(然后事务二被回滚)

数据库里为"张三",但是读取为李四,所以为"脏"读

    左边是事务1,先查一次,查到id为1的数据name为张三,这时候事务2又来了,把张三改成了李四,然后事务1又进行了一次查询,查出来了name为李四,那么假如这时候事务2发生了回滚,也就是name还是张三,但是事务1却读到了李四,这就是脏读

1.2已提交读(read commit) RC

oracle和mysql的默认隔离级别

在已提交读的情况下,虽然未提交的事务数据不会读取到,但是在这种情况下,会由于事务的执行也是需要时间的,在一个事务的两次相同查询间隔期间,存在其他事务提交,对数据库的数据进行了删除或者插入,那么这一个事务的两次查询结果就不一致了,这就是不可重复读。

1.2.1如何避免不可重复读:

mysql:

这里必须提到Mysql并发控制策略(策略)——共享锁和排他锁,见另一标题(mysql锁介绍)。

基于MyISAM引擎表在执行查询前,会自动执行表的加锁、解锁操作,一般情况下不需要用户手动加、解锁,但是有的时候也需要显式加锁,例如上文中存在的同一个事务中的两次关联紧密查询。

形如:


lock tables ynst_fgfc_sum_app_dq_rlt_anls read,ynst_fgfc_count read;

select * from ynst_fgfc_sum_app_dq_rlt_anls;

select * from ynst_fgfc_count;

unlock tables;

1.3可重复读(repeatable read) RR

该情况解决了不可重复读的问题,但是存在幻读的问题,也就是在一个事务的两次查询过程中,存在更新和删除语句,查询出来的记录存在误差,给人一种幻觉,说起来和不可重复读基本一致,但是不可重复读针对的是数据库的更新和删除操作,幻读针对的是插入操作。

1.3.1串行化serializable

最高级别隔离,所有的事务都是顺序执行的,不存在并行的情况,所以也就不会出现脏读,幻读和不可重复读,但是这样肯定是降低了数据库执行效率的。

1.3.2事务隔离实现方案

LBCC

适用于读多写少的使用场景,在事务执行时锁定所有关联资源,读取时给数据加上共享锁,不允许其他事务给数据加上排他锁,写入时给数据加上排他锁,不允许其他任何锁的添加,执行完成之后进行锁的释放。

MVCC

适用于写多读少的使用场景,引用涉及到了快照的概念,大致理念是在事务的第一次查询是通过数据库innodb引擎内部给表添加的DB_TRX_ID(事务id)字段和DB_ROLL_PTR(回滚指针)给数据添加快照,其他事务改变数据时会给这两个字段进行填充,涉及到的事务通过这两个字段的填充值在解析sql时添加条件从而达到事务涉及数据不变的效果。

2.mysql锁介绍

锁的开销是较为昂贵的,锁策略其实就是保证了线程安全的同时获取最大的性能之间的平衡策略。

共享锁:

共享锁又称读锁,即多个连接可以共享读取同一条数据,但仅限于读取时使用,在没有排他锁加在资源上时,读锁是可以协调所有资源的,读锁之间不互相阻塞。

排他锁:

排他锁又称写锁,即当进行写入操作时,将当前表/当前行数据进行锁定,阻止其他的事务对表/行进行写入/读取,注意排他锁会阻塞所有相关的事务对数据的写入和读取,所以优先级是高于读锁的。这里有两个策略,一个是表锁,一个是行锁,mysql的基本锁策略默认使用的表锁:

  1. 表锁,顾名思义,锁住当前整个表,开销最小。

  2. 行锁,锁住当前事务所设计的表,一般是在存储引擎底层使用,开销最大

(这里的开销指的是系统对锁的管理,如果系统分配太多资源管理锁,自然会导致性能下降)

2.1锁使用场景

以一个sql举例:


update from 表A set columnA = "张三" where columnB = 1;

如果columnA存在索引,查询时会对匹配行进行锁定,不存在索引时进行锁表。

上面的太简单了:

实际上如何分析加锁,首先应该了解三点:

  1. 隔离级别(上面有提到)

  2. 索引和执行计划https://www.jianshu.com/p/7a0c215edb1d

  3. sql中字段是否含有索引

2.1.1锁使用情况查询


select * from infORMation_schema.innodb_locks

查看数据库锁的使用情况(innodb引擎)


select * from information_schema.innodb_lock_waits

索引类型

普通索引,查询时会用到的,并不要求唯一性的常用索引


create index ynst_fgfc_sum_app_dq_rlt_anls_DAY_FG_CNT_uindex

on ynst_fgfc_sum_app_dq_rlt_anls (DAY_FG_CNT);

唯一索引(关键字unique),要求涉及到的列/组合列唯一,可以包含空值,和主键不一样,主键是唯一索引加上字段不为空限制


create unique index ynst_fgfc_sum_app_dq_rlt_anls_DAY_FG_CNT_uindex

on ynst_fgfc_sum_app_dq_rlt_anls (DAY_FG_CNT);

全文索引(关键字FULLTEXT),在mysql3.2版本加入,但是在mysql5.7.6才支持中文全文索引,只能在VARCHER,VACHER2,TEXT类型的字段上加索引。

添加索引:


alter table ynst_fgfc_sum_app_dq_rlt_anls add fulltext testIndex(PRO_CODE);

直接创建索引:


create fulltest index on ynst_fgfc_sum_app_dq_rlt_anls (PRO_CODE)

注意: 1:先导入数据再创建全文索引比后导入数据再创建索引要快很多

目前全文索引值支持MyISAM和InnoDB两种存储引擎

索引的作用是为了加快查询速度,所以在使用索引优化数据库的同时

一方面是需要让sql命中索引(暂放)

一方面也需要明确索引的使用场景,给表加上索引会降低数据的更新速度,执行更新操作之后数据库需要对索引文件进行保存操作,数据量过大会带来时间上的损耗,索引文件一般不会很大,但是在大数据量+组合列索引的情况下会比较严重,它会大幅占用磁盘空间。

4.存储引擎

数据库默认的存储引擎是InnoDb

除此之外还有MyISAM存储引擎

MEMORY存储引擎(瞬态,非重要的数据,数据服务重启后丢失)

MERGE存储引擎

CSV存储引擎

InnoDB与MyISAM最大不同有两点:

  1. 支持事务
  2. 采用行级锁

具体见官网说明

Https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

查询资料:

  1. 深入分析MySQL中事务以及mvcC的实现原理

https://baijiahao.baidu.com/s?id=1669272579360136533&wfr=spider&for=pc

  1. mysql索引总结

https://www.jianshu.com/p/7a0c215edb1d

  1. 深入理解mysql——锁、事务和并发控制

https://zhuanlan.zhihu.com/p/36060546

 
您可能感兴趣的文档:

--结束END--

本文标题: 事务隔离级别、锁、索引、存储引擎

本文链接: https://lsjlt.com/news/7533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 事务隔离级别、锁、索引、存储引擎
    1.隔离级别 1.1未提交读(read uncommit) RU 这是最低级别的隔离等级: 在这种隔离级别下,可以读取未提交的事务修改/更新到的数据,基本无数据库会选择该隔离级别 事务一  select * fro...
    99+
    2021-12-21
    事务隔离级别 索引 存储引擎
  • MySQL锁与事务隔离级别
    1、概述 (1)锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据...
    99+
    2021-12-05
    MySQL锁与事务隔离级别
  • 数据库 --- 索引、触发器、事务(存储引擎)
    一、数据库  -----   按照数据结构来组织、存储和管理数据的仓库  主要特点:实现数据共享;减少数据的冗余度;数据的独立性;数据实现集中控制;数据一致性和可维护性,以确保...
    99+
    2024-04-02
  • MySQL 存储引擎和锁
    MySQL 存储引擎和锁===============================================================================存储引擎: &...
    99+
    2024-04-02
  • 数据库之——索引、触发器、事务(存储引擎)
    一. 数据库    数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。其主要特点有如下几个方面:实现数据共享数据共享包含所有用户可同时存取数据库中的数据,也包括用户可...
    99+
    2024-04-02
  • MySQL事务隔离级别、锁信息
    MySQL事务隔离级别、锁信息 ...
    99+
    2024-04-02
  • Mysql索引、存储引擎有何具体区别
    下文我给大家简单讲讲关于Mysql索引、存储引擎有何具体区别,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完Mysql索引、存储引擎有何具体区别对大家多少有点帮助吧。一、普通索...
    99+
    2024-04-02
  • Innodb存储引擎索引概述
    Innodb存储引擎索引概述该存储引擎支持两种常见的索引:B+索引、Hash索引。Hash索引Innodb存储引擎支持的Hash索引是自适应的,引擎会根据表的使用情况自动生成Hash索引,不能人为干预是否在...
    99+
    2024-04-02
  • mysql中索引,触发器,事务,存储引擎的理解
    1、索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询。   索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象。...
    99+
    2024-04-02
  • 事务隔离级别
    事务隔离是数据库处理的基础之一,Isolation是ACID中I的缩写,当多个事务同时进行更改和执行查询时,隔离级别是微调性能和可靠性、一致性和结果再现性之间的平衡的设置 MySQL支持以下几个隔离级别 ...
    99+
    2024-04-02
  • 事务隔离性和隔离级别
    隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 事务的隔离级别有哪些? 一、概念 Read uncommitted(读未提交) Read ...
    99+
    2021-04-27
    事务隔离性和隔离级别
  • MySQL(7)-mysql索引和存储引擎
         本篇博客讲的是MySQL的索引的功能和使用 , 以及存储引擎的基本简介 一. mysql索引索引的简介和作用索引在MySQL中叫做"键" , 是存储引擎用于快速找到记录的一种数据结构 . 索引对良...
    99+
    2024-04-02
  • MySql中的存储引擎和索引
    目录一、MySql的逻辑结构二、什么是存储引擎MySQL支持的存储引擎三、操作四、数据库的索引索引的分类五、索引操作一、MySql的逻辑结构 MySQL体系结构分为四层:分别是连接层...
    99+
    2022-11-13
    MySql存储引擎 MySql索引
  • MySQL存储引擎中的索引分析
    本篇内容主要讲解“MySQL存储引擎中的索引分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL存储引擎中的索引分析”吧!我们知道不同的存储引擎文件是不...
    99+
    2024-04-02
  • MYSQL RC 和RR隔离级别差异性(无索引)
     今天一个朋友咨询我关于MYSQL 的LOCK,我针对他的问题,整理了一篇BLOG,供大家了解学习,有兴趣的同学可以参考来测试加深原理的理解。 ...
    99+
    2024-04-02
  • MySQL事务隔离级别
      四类隔离级别    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。  Read Unc...
    99+
    2024-04-02
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • Mysql Innodb存储引擎之索引与算法
    目录一、概述二、数据结构与算法1、二分查找2、二叉查找树和平衡二叉树1)二叉查找树2)平衡二叉树三、B+树1、B+树完整定义2、关于 M 和 L的选定案例四、B+树索引1、聚集索引2...
    99+
    2024-04-02
  • MySQL中有哪些锁与事务隔离级别
    本篇文章为大家展示了MySQL中有哪些锁与事务隔离级别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  1、概述  (1)锁的定义  锁是计算机协调多个进程或线程并...
    99+
    2024-04-02
  • MySQL 事务的隔离级别
    1. 事务的ACID 事务的ACID是指事务拥有的4个特性的首字母组合:atomicity(原子性), consistency(一致性), isolation(隔离性)和durability(持久性)。 ①atomicity(原子...
    99+
    2019-01-27
    MySQL 事务的隔离级别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作