概述
Mysql数据库在处理并发中下了很多功夫,锁是为了更好的保护数据的正确和可靠,Mvcc是维持一个数据的多个版本,使得读写操作没有冲突的解决并发的数据库方案。
锁
当数据访问多了,就会出现并发的问题,Mysql锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
(资料图)
全局锁
全局锁就是对整个数据库实例加锁,当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁命令:
//加锁Flush tables with read lock;//释放锁命令unlock tables;
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
mysql> UPDATE runoob_tbl SET runoob_title="学习 C++" WHERE runoob_id=1;2013 - Lost connection to server during querymysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());2013 - Lost connection to server during querymysql> SELECT * FROM runoob_tbl;+-----------+--------------+---------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-----------+--------------+---------------+-----------------+| 1 | Go 学习 | 菜鸟教程 | 2023-03-22 |+-----------+--------------+---------------+-----------------+1 row in set (0.01 sec)
释放全局锁后,所有的进程得到释放,需要注意的是如果是终端操作需要清空链接缓存,或者打开新链接重试,mysql释放锁在当前的链接中是不生效的。
mysql> use mysql2;Database changedmysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());Query OK, 1 row affected (0.03 sec)
表级锁
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
表锁是最常用的处理并发的方式。而对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,毕竟锁住整个表的影响面还是太大。
另一类表级的锁是 MDL(metadata lock)。
//加锁lock tables 表名 ... read/write;//释放锁unlock tables;
表级锁分读锁和写锁,1)读锁,在进行读锁时,读不会受到影响但是会阻塞其他进程的insert、update操作。
mysql> lock tables runoob_tbl read;Query OK, 0 rows affected (0.05 sec) mysql> select * from runoob_tbl;+-----------+--------------+---------------+-----------------+| runoob_id | runoob_title | runoob_author | submission_date |+-----------+--------------+---------------+-----------------+| 1 | 学习 C++ | 菜鸟教程 | 2023-03-22 || 2 | 学习 PHP | 菜鸟教程 | 2023-03-22 || 3 | 学习 PHP | 菜鸟教程 | 2023-03-22 |+-----------+--------------+---------------+-----------------+3 rows in set (0.02 sec)//写操作mysql> INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW());2013 - Lost connection to server during querymysql> UPDATE runoob_tbl SET runoob_title="学习 C++" WHERE runoob_id=1;2013 - Lost connection to server during query
2)写锁,对指定表加了写锁,会阻塞右侧客户端的读和写。
mysql> lock tables runoob_tbl write;Query OK, 0 rows affected (0.02 sec)mysql> unlock tables;Query OK, 0 rows affected (0.03 sec)
行锁
MySQL 的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。
行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。
两阶段锁协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度是 O(n) 的操作,要耗费大量的 CPU 资源,应该在逻辑上进行优化。
Mvcc
因为加锁会影响效率,MVCC全称多版本并发控制(Multiversion concurrency control, MCC 或 MVCC),是数据库管理系统常用的一种并发控制,理念是维持一个数据的多个版本,使得读写操作没有冲突的解决并发的数据库方案。
当前读和快照读
Mvcc 把事务的执行语句分为当前读和快照读。
当前读:总是读取最新的版本的记录。快照读:读取历史版本的记录,历史版本保存在undo Log(回滚日志)中,快照读就是MySQL为我们实现MVCC理想模型的其中一个具体非阻塞读功能。//select * from Table //快照读//Insert Update Delete //当前读//Select ... lock in share mode //当前读//Select ... for update //当前读
事务的隔离解决有四种,可重复读(RR)、读已提交(RC)、读未提交、序列化,查看全局隔离权限语句,旧版的myql使用tx开头,否则报错1193 - Unknown system variable "tx_isolation"
。
mysql> show variables like "transaction_isolation";+-----------------------+-----------------+| Variable_name | Value |+-----------------------+-----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+-----------------+1 row in set (0.07 sec)mysql> select @@transaction_isolation;+-------------------------+| @@transaction_isolation |+-------------------------+| REPEATABLE-READ |+-------------------------+
如果没有设置隔离级别,可使用下面语句进行设置。
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;Query OK, 0 rows affected (0.03 sec)
MVCC的实现原理
MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。
每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段。
DB_TRX_ID : 创建或最后修改记录的事务IDDB_ROW_ID : 隐藏主键DB_ROLL_PTR :Undo Log里的回滚指针,7byte大小read-view:事务在快照时产生的读视图。
trx_list : 系统活跃的事务IDup_limit_id : 列表中事务最小的IDlow_limit_id : 系统尚未分配的下一个事务IDMvcc判断的规则:
1.比较DB_TRX_ID和up_limit_id,如果小于,则当前事务能看到DB_TRX_ID的记录,如果大于和等于,则进入下一个判断
2.比较DB_TRX_ID和low_limit_id,如果大于等于则代表DB_TRX_ID的记录在read-view生成后出现的,那么对于当前事务不可见。如果小于,则进入下一个判断。
3.判断DB_TRX_ID是否在活跃事务中,如果在,代表read-view生成时,事务还在活跃状态,修改的数据当前的事务是看不到的,如果不在,说明事务在read-view之前就commit了,那么修改的结果就是可见的。
可重复读(repeatable read):每次进行快照读时都生成读视图。
读已提交(read committed):只有第一次时生成读视图,之后没次都使用第一次时的读视图。
Mysql ( Innodb引擎 ) 保证数据的一致性
1.执行更新语句update table set a= 1 where id = 2
2.将id=2
的行上的列值改为1
3.将修改更新到内存中
4.记录在第N个Page的地方做修改,并将这行记录状态为prepare
5.修改好了,可以提交事务了
6.写入binlog
7.commit,提交事务
8.将redo log里这个事务的相关记录状态置为commit状态
这个数据提交过程,就是两阶段提交,在恢复数据时,用binlog和redolog两部分来比较做数据恢复就可以了。
事务
事务的特性:
原子性:UndoLog 隔离性:Mvcc持久性:RedoLog一致性:以上3个共同保证了一致性问题
1.既然有了redolog,为什么还要有binlog呢?
redolog依赖于搜索引擎层,并不是每一个引擎都有redolog,binlog是属于MysqlServer层。
关键词:
推荐内容
- 环球新消息丨Mysql高可用高性能存储应用
- 焦点快报!胖人减肥后皮肤松弛怎么解决的_
- 世界微资讯!“三引领五着力” 全年工作
- 焦点资讯:信阳鸡公山在哪里
- 当前热文:调查|放着泊位不停,车主为何
- 快看点丨唐七公子作品哪些好看_唐七公子
- 全球观速讯丨保姆级 Prometheus PromQL
- 世界速递!挖沟槽土方的工作内容包括
- 【聚看点】古村白墙黛瓦 瓷韵茶香悠长
- 【当前独家】08月24日朔州前往淄博出行防
- 天天资讯:山东2地最新人事任免
- 速讯:山西平遥旅游攻略
- 焦点速读:4-6,2-6!金花朱琳连丢两盘遗
- 每日热门:股票行情快报:华昌达(300278
- 观点:女子生前贷款打赏男主播85万:给女
- 全球通讯!天津博物馆馆藏绘画精品展在美
- 每日动态!朋友圈刷屏!有房无贷首付5成变
- 每日关注!科幻电影的疫病想象与生态问题
- 每日速读!被称为足球皇帝的德国人是谁
- 【环球热闻】百亿补贴!Apple iPhone 1
- 短讯!今日热文:莫言殇作品有哪些?莫言
- 全球报道:瑞可达:公司的产品广泛应用于
- 每日讯息!阎良公安:“少年护苗先锋队”
- 每日资讯:桑葚的功效与作用禁忌及食用方
- 观焦点:美洛昔康片的作用与用途_美洛昔
- 当前热门:克洛伊电影简介
- 【环球速看料】古代虐心言情小说推荐_古
- 全球热讯:助纣为虐的反义词_助纣为虐什么
- 环球头条:延期到年底 西安个人自用充电
- 关注:文力_关于文力简介
- 全球微资讯!曲率性近视怎么控制_曲率
- 观点:上海博物馆地址
- 环球动态:东芝同意接受日本基金JIP牵头的
- 观速讯丨招贴画是什么样的_招贴画是什么
- 今日播报!瑞穗:瑞士央行会议可能加息50
- 世界热讯:11月3日蚂蚁庄园答案大全(11月
- 快消息!每日信息速递
- 每日时讯!兴高采烈的近义词
- 全球信息:《欢乐三国杀》新版本礼包已开
- 热门看点:2023年2月捷尼赛思G80销量多少
- 环球视点!孕期吃火龙果可以吗_孕妇吃火
- 天天观察:驻中非大使馆再发紧急提醒:班
- 每日速看!2022年犯太岁最凶的4大生肖,生
- 每日热议!【云原生 • Prometheus】云
- 【全球时快讯】男星在车站晕倒后猝逝,曾
- 快报:北京故宫介绍红墙_北京故宫介绍
- 全球新动态:“这种零距离的庭审现场,真
- 热门:天天酷跑所有坐骑
- 世界即时:世界最穷的国家排名_世界上最
- 热门看点:补贴有术的拼多多
- 【世界快播报】宏石激光研发费用率低于同
- 环球今热点:电话的发明者是谁呢_电话的
- 天天微资讯!用自发粉怎么做包子_自发粉
- 报道:风=͟͟͞͞沙=͟͟͞͞预=͟͟
- 每日快讯!很污的作文作文_很黄很污的作文
- 今日观点!「嘉实价值基金净值」中电电机
- 要闻:吉林省经贸代表团在印度尼西亚签订
- 全球今头条!展示!推介!签约!西安无人
- 焦点报道:全新电动概念车首秀!起亚发布
- 环球快看点丨普定县气象台发布大风蓝色预
- 短讯!今日热文:莫言殇作品有哪些?莫言
- 全球报道:瑞可达:公司的产品广泛应用于
- 每日讯息!阎良公安:“少年护苗先锋队”
- 每日资讯:桑葚的功效与作用禁忌及食用方
- 观焦点:美洛昔康片的作用与用途_美洛昔
- 当前热门:克洛伊电影简介
- 【环球速看料】古代虐心言情小说推荐_古
- 全球热讯:助纣为虐的反义词_助纣为虐什么
- 环球头条:延期到年底 西安个人自用充电
- 关注:文力_关于文力简介
- 全球微资讯!曲率性近视怎么控制_曲率
- 观点:上海博物馆地址
- 环球动态:东芝同意接受日本基金JIP牵头的
- 观速讯丨招贴画是什么样的_招贴画是什么
- 今日播报!瑞穗:瑞士央行会议可能加息50
- 世界热讯:11月3日蚂蚁庄园答案大全(11月
- 快消息!每日信息速递
- 每日时讯!兴高采烈的近义词
- 全球信息:《欢乐三国杀》新版本礼包已开
- 热门看点:2023年2月捷尼赛思G80销量多少
- 环球视点!孕期吃火龙果可以吗_孕妇吃火
- 天天观察:驻中非大使馆再发紧急提醒:班
- 每日速看!2022年犯太岁最凶的4大生肖,生
- 每日热议!【云原生 • Prometheus】云
- 【全球时快讯】男星在车站晕倒后猝逝,曾
- 快报:北京故宫介绍红墙_北京故宫介绍
- 全球新动态:“这种零距离的庭审现场,真
- 热门:天天酷跑所有坐骑
- 世界即时:世界最穷的国家排名_世界上最
- 热门看点:补贴有术的拼多多
- 【世界快播报】宏石激光研发费用率低于同
- 环球今热点:电话的发明者是谁呢_电话的
- 天天微资讯!用自发粉怎么做包子_自发粉
- 报道:风=͟͟͞͞沙=͟͟͞͞预=͟͟
- 每日快讯!很污的作文作文_很黄很污的作文
- 今日观点!「嘉实价值基金净值」中电电机
- 要闻:吉林省经贸代表团在印度尼西亚签订
- 全球今头条!展示!推介!签约!西安无人
- 焦点报道:全新电动概念车首秀!起亚发布
- 环球快看点丨普定县气象台发布大风蓝色预
- 观热点:房屋拆迁签订补偿协议怎么写
- 天天热点!胃病看哪个科室_胃病看什么科
- 天天微动态丨八亿时空:目前公司光刻胶树
- 天天热点!卡耐基的书籍大全_卡耐基的书
- 天天看热讯:联盟空砍王出炉:多项数据证
- 环球热头条丨穿井得一人一词多义古今异义
- 环球焦点!景业智能: 景业智能第一届董
- 每日速递:阳原县消防救援大队多举措优化
- 世界微资讯!梦幻西游元宵怎么吃(元宵怎
- 天天看点:医保卡的余额是个人缴费部分吗
- 环球速递!饮水饮汤都会中毒致癌不孕?医
- 精彩看点:浙江:力争全省汽车产业实现规
- 【环球热闻】word打不开解决方法_word打
- 环球报道:斯帕莱蒂谈欧冠抽签:若要我选
- 每日快讯!河北遵化:以花为媒 唱好春季
- 每日头条!如何取消文件夹加密_加密的文件
- 天天亮点!今天,他结婚了,全网祝福!
- 全球热点!热砂之乐园存档_热砂之乐园攻略
- 环球热头条丨滴滴注册车型不符合标准_滴
- 全球最新:火影忍者美女黄禁照片视频_火