导读

并发问题:同一时刻进行读写,并发问题回引发数据不一致问题。

解决并发问题:MySQL采用了锁定机制去解决并发问题

锁的分类

  MySQL使用两种锁机制去解决问题:共享锁排他锁,也叫读锁或者写锁。

    • 共享锁、读锁:不影响其他连接的读,写会受影响
    • 排他锁、写锁:会不让其他连接进行读写

  MySQL针对不同的数据粒度,又分别使用表锁行锁进行锁定。

锁的实现

  MySQL是使用MVCC(Multi-Version Concurrency Control)实现的(性能很好,其实并没有真正上锁)。

    • 悲观锁(真正上锁)
    • 乐观锁(通过一些递增的字段来控制逻辑上锁)

  MVCC这种机制是通过对一行数据的几个隐藏列进行操作实现的。

  B+树的数据行,其实每一行都要加上几个隐藏列(版本号,一条记录可能对应几个版本号,差不多可以这样理解,一个版本号,对应一个快照)

服务层和存储引擎层

  服务层只是实现了表锁:

    加锁:lock table 表名 read(write),表名2 read(write)

    解锁:unlock tables;

  存储引擎层实现行锁(只有InnoDB和extraDB实现了行锁)

  存储引擎层和服务器层可能都实现了行锁,但是实现逻辑不一样,优先使用存储引擎层的实现。

  事务部分会隐式的去加行锁和表锁,其中这个表锁不是服务器层实现的表锁。

行锁和表锁对比

  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

  行级锁:开销大,加锁慢;回出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最大

MVCC并发控制,读操作分类

  在MVCC并发控制中,读操作可以分成两类:快照读(snapshot read)与当前读(current read)

  快照读,读取的记录的可见版本(有可能是历史版本),不用加锁。

  当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。

快照读:简单的select操作,属于快照读,不加锁。

select * from table_name where ?;

当前读:特殊的操作,插入/更新/删除操作,属于当前读,需要加锁。

select * from table_name where ? lock in share mode;
select * from table_name where ? for update;
insert into table_name values (...);
update table_name set ? where ?;
delete from table_name where ?;

  以上都属于当前读,读取记录的最新版本。并且读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加S锁(共享锁)外,其他的操作,都加的事X锁(排他锁)。

InnoDB和MyISAM最大区别

InnoDB有行级锁和事务

MySQL 并发控制(锁得使用)的更多相关文章

  1. 【MySQL】锁入门

    要做的完全掌握MySQL/InnoDB的加锁规则,甚至是其他任何数据库的加锁规则,需要具备以下的一些知识点 了解数据库的一些基本理论知识:数据的存储格式 (堆组织表 vs 聚簇索引表):并发控制协议 ...

  2. 浅谈数据库并发控制 - 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...

  3. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

    原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...

  4. mysql的锁机制详解

    这段时间一直在学习mysql数据库.项目组一直用的是oracle,所以对mysql的了解也不深.本文主要是对mysql锁的总结. Mysql的锁主要分为3大类: 表级锁:存储引擎为Myisam.锁住整 ...

  5. mysql的锁与事务

    1. MySQL中的事物 1.InnoDB事务原理 1. 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 2. 在数据库提交 ...

  6. MySQL:锁机制和隔离事务级别

    在mysql中的锁看起来是很复杂的,因为有一大堆的东西和名词:排它锁,共享锁,表锁,页锁,间隙锁,意向排它锁,意向共享锁,行锁,读锁,写锁,乐观锁,悲观锁,死锁.这些名词有的博客又直接写锁的英文的简写 ...

  7. 五分钟详解MySQL并发控制及事务原理

    在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...

  8. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

  9. mysql行锁和表锁

    mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 ...

  10. MYSQL的锁介绍,以及死锁发生情况-带例子

    mysql锁能在并发情况下的mysql进行更好的优化 MySQL有三种锁的级别:页级.表级.行级,这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...

随机推荐

  1. 🔥httpsok彻底告别SSL证书续期烦扰

    httpsok彻底告别SSL证书续期烦扰 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx .OpenResty 服务器设计.已服务众多中小企业,稳定.安全.可靠. ...

  2. 洛谷P3543 [POI2012] WYR-Leveling Ground

    题目描述 给定 \(n\) 个数和 \(a,b\) 每次可以选择一段区间 \(+a,-a,+b ,或 -b\),问最少操作几次能把它们都变成 \(0\).如果无解请输出 \(-1\). 样例输入 5 ...

  3. Garnet:微软官方基于.NET开源的高性能分布式缓存存储数据库

    前言 前不久Redis宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSALv2 和 SSPLv1 协议,该协议变化意味着Redis不再开源.今天给大家分享一款完全开 ...

  4. MYSQL造数据占用临时表空间

    在MySQL中,临时表空间通常用于存储如ORDER BY.GROUP BY.DISTINCT.UNION.JOIN等操作中产生的临时数据.当这些操作的数据集太大而无法在内存中完成时,MySQL会使用磁 ...

  5. 【c#】JavaScriptSerializer 不序列化null值

    首先引用dll :System.Web.Extensions. 再自定义转换器代码如下: public class JavaScriptSerilizeConvert : JavaScriptConv ...

  6. Linux之top命令分析

    第一行: top - 04:25:26 当前系统时间 up 3 min, 系统已经运行的时间(不间歇的运行) 1 user, 当前登录系统的用户数 load average: 0.01, 0.03, ...

  7. golang 切片原理面试题

    package main import "fmt" func main() { var s = make([]int, 0, 10) _ = append(s, 1,2,3) fm ...

  8. RabbitMQ系列(五) RabbitMQ的文件和目录位置

    概述 每个RabbitMQ节点使用一些文件和目录,用于加载配置.存储数据 / 元数据 / 日志文件等等.这些文件和目录的位置是可以自定义的. 本指南涵盖: 1)如何自定义RabbitMQ节点所使用的各 ...

  9. Prism IoC 依赖注入

    现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Pri ...

  10. PaddleOCR在 windows下的webAPI部署方案

    很多小伙伴在使用OCR时都希望能过采用API的方式调用,这样就可以跨端跨平台了.本文将介绍一种基于python的PaddleOCR识方案.喜欢的可以关注公众号,获取更多内容. # 一. windows ...