一、MySQL逻辑架构

客户端
链接/线程处理
查询缓存 解析器 优化器
存储引擎

二、锁

1、读写锁

读锁是共享的,是互相不阻塞的,多个客户在同一时间读取同一资源,互补干扰。写锁是排他的,会阻塞其他的写锁和读锁,写锁有更高的优先级~

一种提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有的资源,锁定的资源越少,系统的并发性更好。

表锁(table lock)

表锁是锁开销最小的策略,会锁定整张表,一个用户对表进行写操作前,需要先获得写锁,这会阻塞其他用户对表的所有读写操作。举例:有如下一张表

CREATE TABLE `emp2` (`id` int(11) NOT NULL DEFAULT '0',`name` varchar(100) NOT NULL,`job` varchar(100) NOT NULL,`num1` int(10) DEFAULT NULL,`num2` int(10) DEFAULT NULL,`num3` int(10) DEFAULT NULL,`job_num` int(10) DEFAULT NULL,`d` date DEFAULT NULL,PRIMARY KEY (`id`),KEY `job_num` (`job_num`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

我们在一个终端中加上读表锁

然后打开另一个终端,可以读但不可以写

直到第一个链接释放锁之后,才能修改成功。

行级锁:

行锁可以最大程度的支持并发,但是锁的开销也最大,InnoDB支持行级锁,在存储引擎层实现。

死锁:

两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源时,导致产生死锁,比如有如下2个事务

#事务1
start transaction;
update tab set col=45 where id = 4;
update tab set col=54 where id = 3;
commit;
#事务2
start transaction;
update tab set col=12 where id = 3;
update tab set col=18 where id = 4;
commit;

如果巧合,两个事务都执行了第一条,更新了一行,同时锁定了该行数据,接着都尝试去执行第二条,却发现被对方锁定,然后2个事务都等待对方释放锁,则陷入死循环。为了解决这问题,数据库系统实现了各种死锁检测和死锁超时机制。

2、隐式和显式锁定

隐式:InnoDB,在执行事务过程中会自动加锁,除非执行COMMIT或ROLLBACK时锁会自动释放。

显式:可以使用SELECT...LOCK IN SHARE MODE || SELECT...FOR UPDATE生成锁

三、InnoDB的MVCC(多版本并发控制)

通过在每行记录的最后保存2个隐藏的列来实现。一个保存行的创建时间,一个保存行的过期时间,其实存的系统版本号。每开始一个新的事务,系统版本号都会递增。事务开始时刻的系统版本号作为事务的版本号,用来和查询到的每行记录的版本号来比较。

SELECT:

InnoDB会根据以下2个条件检查每行记录:

a、只查找版本早于当前事务版本的数据行,也就是行的系统版本号小于或等于事务的系统版本号,这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或修改的。

b、行的删除版本要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行在事务开始之前未被删除。

INSERT:

InnoDB为新插入的每一行保存当前系统版本号为行版本号

DELETE:

InnoDB为删除的每一行保存当前系统版本号作为行的删除标示。

UPDATE:

InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标示。

保存这2个额外的系统版本号,使大多数读操作都可以不用枷锁。这样数据库操作简单,性能也会很好,并且保证只会读到标准的行。但是需要额外的空间和更多的检查工作。

高性能的MySQL(1)锁和MVCC相关推荐

  1. Mysql的锁以及MVCC解决事务隔离级别

    本文不再阐述数据库的ACID,请了解后再来阅读此文! 一.Mysql中的锁 首先我们要知道mysql锁,锁住的是索引,当不设置索引的时候会将隐藏字段设置为索引,且隐藏字段默认走全表扫描,所以当不设置主 ...

  2. mysql之锁与事务

    相关博文推荐: mysql之高性能索引 Mysql之锁与事务 平时的业务中,顶多也就是写写简单的sql,连事务都用的少,对锁这一块的了解就更加欠缺了,之前一个大神分享了下mysql的事务隔离级别,感觉 ...

  3. 关于mysql行级锁中MVCC的一些理解

    一.MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代 ...

  4. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析

    锁的引入 如果A有100元,同时对B.C转账,若处理是同时的,则此时同时读取A的余额为100元,在对两人转账后写回,A的余额不是0元而是50元.因此,为了防止这种现象的出现,要引入锁的概念,如只有在A ...

  5. MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)

    MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...

  6. Mysql锁与MVCC机制

    我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写.脏读.不可重复读.幻读这些问题. 这些问题的本质都是数据库的多事务并发问题,为了解 ...

  7. MySQL InnoDB锁机制全面解析分享

    写在前面:在设计新零售供应链wms(仓库管理系统)库存模块时,为了防止并发情况对库存的影响,查阅了一些资料,对InnoDB锁机制有了更全面的了解,在此做出分享,如有疏漏望不吝指正,愿共同进步!(此篇为 ...

  8. MySql各种锁机制的学习

    加锁的目的: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.锁 ...

  9. mysql update 锁_Mysql心路历程:两个”log”引发的”血案”

    今年开始,自己开始修炼储存与消息相关的技术"内功",想着在当下的开发工作与未来的路途发展中,这两大块是无论如何都无法避开的,所以就开始加强:Mysql.redis与Mq.Mysql ...

  10. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

最新文章

  1. CNN中,1X1卷积核到底有什么作用呢?
  2. 正版python软件多少钱-北京正版软件SeismoSelect 价目表
  3. js数组中foEach和map的用法详解 jq中的$.each和$.map
  4. 最新发布!《阿里云实时计算 Flink 版解决方案白皮书-2021版》开放下载
  5. 使用 Azure Web 应用防火墙拦截黑客攻击
  6. 【渝粤题库】国家开放大学2021春4010渠道管理题目
  7. matlab cell转数组_MATLAB批量修改文件名
  8. nio2 java_java nio2
  9. CentOS7下安装JDK1.8过程记录
  10. mojoportal学习——文章翻译之使用Artisteer快捷的创建模板
  11. android蓝牙软件,Android手机蓝牙助手(Bluetooth File Transfer)
  12. C++中实现调用外部程序的方法
  13. 技术人员日本游学之精益管理
  14. 永磁同步电机数学模型
  15. 银行比赛计算机录入技巧,“金手指”、翻打传票、汉字录入……恒丰银行劳动技能竞赛现场高手过招精彩不断...
  16. 大连渤海・黄海潮汐时间表
  17. 实例演绎Unix/Linux的一切皆文件思想
  18. python+selenium+apscheuler实现微信定时发信息
  19. 【深度学习人类语言处理】1 课程介绍、语音辨识1——人类语言处理六种模型、Token、五种Seq2Seq Model(LAS、CTC、RNN-T、Neural Transducer、MoChA)
  20. ip地址测试软件,服务器ip链接测试软件

热门文章

  1. SpringBoot入门(1)——创建springBoot项目
  2. java中的反射(一)
  3. Centos7下删除virbr0网卡信息
  4. ansible之setup模块常用的信息
  5. 微信OAuth2网页授权登陆接口
  6. spring 读取配置文件的优先级
  7. C# Settings使用小结
  8. 通过/proc/sys/net/ipv4/优化Linux下网络性能
  9. 考前多熟记的知识点(1)~(3)《信息系统项目管理师软考辅导》
  10. urllib2使用总结