MySQL事务隔离性

MySQL事务隔离性事务隔离性 当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。 如果没有隔离,会发生的几种问题 脏读(Dirty Read) 一个事务处理过程里读取…

MySQL事务隔离性

事务隔离性

当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。

如果没有隔离,会发生的几种问题

脏读(Dirty Read)

一个事务处理过程里读取了另一个未提交的事务中的数据

不可重复读(NonRepeatable Read)

对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询的间隔期间,另外一个事务修改并提交了该数据。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……。

幻读(Phantom Read)

在一个事务中读取到了别的事务插入的数据,导致前后不一致。

事务A 按照一定条件进行数据读取,期间事务B插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据。

不同隔离级别的问题

MySQL事务隔离性

MySQL的锁类型

表锁

对一整张表加锁,并发能力低下(即使有分读锁、写锁),一般在DDL处理时使用,myisam也是表锁。

行锁

只锁住特定行的数据,并发能力强,MySQL一般都是用行锁来处理并发事务。

如果用到无索引的字段,那么MySQL会在存储引擎层面将所有的记录加锁,然后由MySQL Server过滤,如果不满足会调用unlock_row把不满足条件的记录释放锁(这里违背了二段锁协议)。

这种情况同样适用于MySQL的默认隔离级别RR。所以对一个数据量很大的表做批量修改的时候,如果无法使用相应的索引,MySQL Server过滤数据的的时候特别慢,就会出现虽然没有修改某些行的数据,但是它们还是被锁住了的现象。

GAP锁(间隙锁)

MySQL使用索引对行锁两边的区间进行加锁,避免其他事务在这两个区间insert的一种锁。

MySQL事务隔离性

 

如图所示:数据库中存在值5,30。那么数据库会将数据段切分以下几个区间:

(negative infinity, 5],

(5,30],

(30,positive infinity)

当对值为30这一行加行锁的时候,会同时对(5,30]和(30,positive infinity)加GAP锁。这样其他事务如果想在这两个区间进行insert操作的时候,需要等待本次事务完成。

如果对不存在的数据进行更新,比如更新20(不存在)对应数据行,那么数据库也会对其存在的区间(5,30]加GAP锁。这样,如果有其他事务想插入值为10的数据,需要等待20这个事务完成。

如果使用的是没有索引的字段,那么会给全表加入GAP锁。

Next-Key锁

Next-Key锁是行锁和GAP锁的合并(MySQL使用它来避免幻读)

MVVC(多版本并发控制)

Innodb中的乐观锁实现。通过它提高MySQL的读取操作的性能。并能解决MySQL的重复读问题。

MVVC在每一行记录的后面加两个隐含列(记录创建版本号和删除版本号)。这里的版本号指的是事务的版本号(每个事务启动的时候,都有一个递增的版本号)。

Innodb中事务隔离级别和锁的关系

Innodb通过使用不同的锁来实现事务隔离

避免脏读

通过对数据加行锁或则表锁,使对同一数据进行操作的事务处于等待状态,来避免同时操作

避免不可重复读

通过MVVC实现事务的可重复读

避免幻读

通过Next-Key锁避免产生幻读现象。

MySQL在RC和RR中都避免了幻读现象。

———————————————————————————————-

悲观锁

乐观锁

在冲突比较少的时候采用乐观锁,减少不需要加锁释放锁的开销,可以提高性能。

在冲突比较多的时候采用悲观锁,减少重复尝试次数,乐观锁重复操作的代价比较大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9294.html

(0)
上一篇 2023-02-11
下一篇 2023-02-11

相关推荐

  • 利用Python的Dictionary实现高效数据存储

    利用Python的Dictionary实现高效数据存储随着数据和计算需求的增加,如何高效地存储和查询数据变得越来越重要。Python中的Dictionary是一个强大的工具,它提供了高效的数据存储和查询功能,使数据处理变得更加便捷。本文将从多个方面来探讨如何利用Dictionary实现高效数据存储。

    2024-01-21
    105
  • 使用PyCharm进行Python开发的注意事项

    使用PyCharm进行Python开发的注意事项Python作为一种高级编程语言,其应用广泛,功能强大。如果你正在使用PyCharm进行Python开发,并且想让你的代码中有中文,那么就需要注意一些事项。

    2024-07-05
    48
  • 当 SQL DELETE 邂逅 Table aliases,会擦出怎样的火花「建议收藏」

    当 SQL DELETE 邂逅 Table aliases,会擦出怎样的火花「建议收藏」开心一刻 晚上,女儿眼噙泪水躺在床上 女儿:你口口声声说爱我,说陪我,却天天想着骗我零花钱,你是我亲爹吗? 我:你想知道真相 女儿:想! 我:那你先给爸爸两百块钱! 环境准备 MySQL 不同版本 利

    2023-06-05
    145
  • Python判断dict键是否存在

    Python判断dict键是否存在Python中的字典(dict)是一种非常常见的数据类型,它可以存储键值对(即key-value对)。在Python中,可以使用in关键字来判断一个键是否在字典中存在,但在实际开发中更常见的是使用字典的get()方法或者直接访问字典的方式来判断键是否存在。

    2024-06-27
    42
  • 腾讯云数据平台_腾讯云计算服务

    腾讯云数据平台_腾讯云计算服务8月18日,由腾讯联合中国电子节能技术协会牵头研制的《键值型数据库系统技术及节能要求》团体标准(以下简称“团标”)正式对外发布。 该团标由腾讯发起,京东、金山云、北京邮电大学等多家企业和高校共同参与制

    2023-05-31
    167
  • mongodb的备份与恢复[亲测有效]

    mongodb的备份与恢复[亲测有效]1.MongoDB 如何备份? >[root@service bin]# mongodump 备份数据 进行备份之后,如果你没指定备份目录会在当前目录自动生成dump备份文件 数据备份

    2023-02-22
    157
  • Redis入门及常用命令学习

    Redis入门及常用命令学习Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key – value 缓存产品有以下三个特点: Redis支持数据的持

    2023-05-02
    169
  • 使用apt install vim安装vim

    使用apt install vim安装vimVim是一款高效的文本编辑器,被广泛应用于编程开发、文本编辑和系统管理等方向。它具有强大的文本编辑功能,支持多种编程语言,特别是在Linux系统上被广泛使用。

    2024-05-14
    70

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注