当前位置: 首页 > news >正文

专业做网站建设公百度百科优化排名

专业做网站建设公,百度百科优化排名,删除wordpress googleapis在线字体,自做网站打开速度慢前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 我们前面了解了行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁 等等相关 我们这里 来看一下 表共享锁, 表排他锁 的获取, 以及 和 其他表级…

前言

我们这里来说的就是 我们在 mysql 这边常见的 几种锁

行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁

我们前面了解了行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁 等等相关

我们这里 来看一下 表共享锁, 表排他锁 的获取, 以及 和 其他表级别锁的冲突的处理

 

需要设置 auto_commit 为 0, 否则不会走 表锁 的相关业务流程

 

 

表排他锁

我们这里调试 sql 如下 这里会先获取 t_user_02 的表排他锁, 然后再释放掉 

begin;
lock tables t_user_02 write;
unlock tables;
commit;

 

我们这里重点关注 “lock tables t_user_02 write;” 的执行流程 

3dd7cc93a2ed6b936a3aad7a03e29ed0.png

 

表锁 mysql层 到 innodb引擎层 的适配是这里的 handler.cc 中进行适配的 

到下图断点这里是 innodb 的处理, 验证了 lock 命令, autocommit 为 false 以及一些其他的条件, 然后 row_lock_table_for_mysql 是整体的获取表锁的业务流程, 诸如 获取到锁之后继续往下走, 没有获取到锁之后 wait, 重试 等等

991523dd4087fce369fd793bffd8c10e.png

 

这里就是获取表锁的宏观流程了, 如果获取到了 则直接返回 

如果没有获取到, 则挂起当前线程, 等待唤醒, 唤醒之后 进行重试

835201ec355509839d256575ac25d000.png

 

获取表锁的具体实现如下, 和之前的获取 表意向共享锁, 表意向排他锁 的情况类似

我们这里重点看一下 表级别锁的兼容机制, 这是影响到能否获取到锁的关键 

47703252643c170e1493d4a555d6648d.png

 

我们这里将问题简单化, 暂时不考虑 matrix 中的 自增长锁 的处理

表意向锁 和 表意向锁 之间是相互兼容的 

表意向锁 和 表锁 之间兼容如下, 表意向共享锁 和 表共享锁 兼容, 其他的三种情况互不兼容 

表锁 和 表锁 之间的兼容如下, 表共享锁 和 表共享锁 兼容, 其他的三种情况互不兼容 

 

对于我们这里 获取表排他锁的场景下面, 只有无锁状态, 我们可以获取成功, 但凡有 其他事务持有 表意向共享/排他锁, 表共享/排他锁 当前事务的获取 表排他锁 都会失败

对于获取 表共享锁 的场景下面, 只有无锁状态, 其他事务获取了表意向共享锁 或者 表共享锁 的情况下面, 我们可以获取锁成功, 但凡有其他事务持有 表意向排他锁, 表排他锁, 当前事务的获取 表共享锁 都会失败

44e9b0931ddcddaa861109cf0113a242.png

 

 

表共享锁

我们这里调试 sql 如下 这里会先获取 t_user_02 的表共享锁, 然后再释放掉 

begin;
lock tables t_user_02 read;
unlock tables;
commit;

 

这里的获取 表共享锁 的流程和前面 获取 表排他锁 的流程一样, 只是 锁的兼容有一些 差异

c373523cd49b71ea895c466b6bb8003e.png

 

我们这里将问题简单化, 暂时不考虑 matrix 中的 自增长锁 的处理

表意向锁 和 表意向锁 之间是相互兼容的 

表意向锁 和 表锁 之间兼容如下, 表意向共享锁 和 表共享锁 兼容, 其他的三种情况互不兼容 

表锁 和 表锁 之间的兼容如下, 表共享锁 和 表共享锁 兼容, 其他的三种情况互不兼容 

 

对于我们这里 获取表共享锁的场景下面, 只有无锁状态, 其他事务获取了表意向共享锁 或者 表共享锁 的情况下面, 我们可以获取锁成功, 但凡有其他事务持有 表意向排他锁, 表排他锁, 当前事务的获取 表共享锁 都会失败

对于 获取表排他锁的场景下面, 只有无锁状态, 我们可以获取成功, 但凡有 其他事务持有 表意向共享/排他锁, 表共享/排他锁 当前事务的获取 表排他锁 都会失败

36927d9bb4d74aa48af28c8795911351.png

 

 

表排他锁阻塞的 N 种方式

表意向排他锁 和 表排他锁 的阻塞方式基本上是一样的, 这里不多赘述 

假设我们这里尝试模拟 各种阻塞的方式, 事务1先进行执行, 然后事务2尝试获取表排他锁, 产生阻塞 

但是这些阻塞 是还没有到获取表锁 之前的目标表的 MDL元数据锁的阻塞 

事务2 这边执行固定的 sql 语句如下 

begin;
lock tables t_user_02 write;
unlock tables;
commit;

 

事务1获取 表意向共享锁 导致 事务2 获取MDL元数据锁 阻塞 

begin;
select * from t_user_02 where id = '1' lock in share mode;
-- sleep 10min
commit;

 

事务1获取 表意向排他锁 导致 事务2获取MDL元数据锁 阻塞

begin;
select * from t_user_02 where id = '1' for update;
-- sleep 10min
commit;

 

事务1获取 表共享锁锁 导致 事务2获取MDL元数据锁 阻塞

begin;
lock tables t_user_02 read;
-- sleep 10min
unlock tables;
commit;

 

事务1获取 表排他锁锁 导致 事务2获取MDL元数据锁 阻塞

begin;
lock tables t_user_02 write;
-- sleep 10min
unlock tables;
commit;

 

 

表共享锁阻塞的 N 种方式

假设我们这里尝试模拟 各种阻塞的方式, 事务1先进行执行, 然后事务2尝试获取表共享锁, 产生阻塞 

但是这些阻塞 是还没有到获取表锁 之前的目标表的 MDL 元数据锁的阻塞 

事务2 这边执行固定的 sql 语句如下 

begin;
lock tables t_user_02 read;
unlock tables;
commit;

 

事务1获取 表意向排他锁 导致 事务2获取MDL元数据锁 阻塞

begin;
select * from t_user_02 where id = '1' for update;
-- sleep 10min
commit;

 

事务1获取 表排他锁锁 导致 事务2获取MDL元数据锁 阻塞

begin;
lock tables t_user_02 write;
-- sleep 10min
unlock tables;
commit;

 

 

表锁的 阻塞 和 唤醒

假设我们这边 事务1 执行 sql 如下 

begin;
select * from t_user_02 where id = '2' for update;
-- sleep 10min
commit;

 

事务2 执行 sql 如下, 然后到 “select * from t_user_02 where id = '2' for update;

” 的时候, 事务会阻塞, 然后 之后手动 commit 事务1, 可以看到 唤醒的流程

begin;
select * from t_user_02 where id = '2' for update;
-- sleep 10min
commit;

 

这个就是通过线程的相关 api 进行 wait 和 notify 了 

wait 这边这边主要是基于 pthread_cond_wait 来进行线程的挂起处理 

6880273094db22086a66e2c2a30a8df6.png

 

手动 commit 事务1, thr 是目标锁 等待队列中取出的一个待唤醒的线程

然后设置会 设置 pthread_cond_wait 中的等待的条件, 以达到唤醒目标线程的效果 

8ab89684cf73ec15848f3671c0d71da1.png

 

来到目标线程这边, 目标线程 被唤醒了, 然后继续走后面的流程 

dab78cd54fd806ca4eaf77fb7f57f7ef.png

 

 

行锁, 表锁, 元数据锁 的查看

行锁的阻塞信息, 可以再 INNODB_LOCKS, INNODB_LOCK_WAITS 中查看 

select * from information_schema.INNODB_LOCKS;
select * from information_schema.INNODB_LOCK_WAITS;

 

构造一个 事务1 获取 id 为 2 的记录的行共享锁, 事务2 获取 id 为 2 的记录的行排他锁, 造成的阻塞 

从这里可以看到 两个事务尝试获取 t_user_02 表的 第3条 记录, 一个获取行共享锁, 一个获取行排他锁

结合等待信息来看, 可以看出的是 获取 行排他锁 的事务在等待 持有 行共享锁 的事务

68a23ca8c9aa9117db7efcb0fbc5fd8e.png

7e73270a119c30950b6ad82424c73ac8.png

 

show processlist 可以看到等待的线程, 以及阻塞的 sql 

工作线程一般是靠后面的线程, 可以推断出 持有锁的线程是 30号, 阻塞的是 31号 线程

026fa9076b9d6f189ec9274d5c1791aa.png

 

 

表锁的阻塞信息, 可以通过如下命令来查看

show open tables where in_use > 0; 

 

执行结果如下, 可以推断的是 t_user_02 的表锁被一个事务持有, 具体的是读锁还是写锁分辨不出来, 只能通过 实际的业务锁获取来判断

如果业务这边获取的是读锁, 则表示持有的是写锁, 如果业务这边获取的是写锁, 则判断不了持有的是读锁还是写锁 

df005f4c21f23a2852af5ca9d52c841b.png

 

show processlist 可以看到等待的线程, 以及阻塞的 sql 

工作线程一般是靠后面的线程, 可以推断出 持有锁的线程是 30号, 阻塞的是 31号 线程

10df0414a3fde2ee3b3d1beb008f52fd.png

 

 

元数据锁 这边一般只有通过 show processlist 中可以看出了 或者 mysql 服务器的堆栈信息

比如如上 表锁的例子

元数据锁在大多数的命令都会获取, 但是生命周期不太一样 

比如 “lock tables t_user_02 read/write;” 类型的指令, 是先获取 表的元数据锁, 然后再执行业务处理, 再释放 表的元数据锁

比如 “select * from t_user_02 where id = '2' for update;” 类型的指令, 是先获取 表的元数据锁, 然后释放 表的元数据锁, 最后再执行业务处理 

因此 构造元数据锁阻塞的方式可以由 事务1 获取表锁, 事务2 获取表锁, 或者行锁都会阻塞, 事务2 阻塞是阻塞在获取 表元数据锁 的地方

8cc70894e23a49344b58732ef165e4da.png

 

 

 

 

 


文章转载自:
http://subring.nrpp.cn
http://displacement.nrpp.cn
http://cashdrawer.nrpp.cn
http://epicondylian.nrpp.cn
http://retrofit.nrpp.cn
http://rheophil.nrpp.cn
http://miniskirt.nrpp.cn
http://iamap.nrpp.cn
http://grossular.nrpp.cn
http://labyrinthitis.nrpp.cn
http://cacuminal.nrpp.cn
http://awestruck.nrpp.cn
http://retral.nrpp.cn
http://coprolagnia.nrpp.cn
http://thibetan.nrpp.cn
http://widowhood.nrpp.cn
http://puerilely.nrpp.cn
http://rca.nrpp.cn
http://inexpansible.nrpp.cn
http://modernist.nrpp.cn
http://menstruate.nrpp.cn
http://packing.nrpp.cn
http://adjt.nrpp.cn
http://tartly.nrpp.cn
http://nokia.nrpp.cn
http://bukovina.nrpp.cn
http://intermediator.nrpp.cn
http://decalitre.nrpp.cn
http://volatility.nrpp.cn
http://uncannily.nrpp.cn
http://hymenopteron.nrpp.cn
http://dotal.nrpp.cn
http://unreached.nrpp.cn
http://theorization.nrpp.cn
http://souzalite.nrpp.cn
http://dichlorodifluoromethane.nrpp.cn
http://equimolecular.nrpp.cn
http://ketol.nrpp.cn
http://catcall.nrpp.cn
http://leadplant.nrpp.cn
http://factualistic.nrpp.cn
http://titrator.nrpp.cn
http://colter.nrpp.cn
http://mudsill.nrpp.cn
http://lethargize.nrpp.cn
http://margarine.nrpp.cn
http://osteometrical.nrpp.cn
http://sacsac.nrpp.cn
http://signality.nrpp.cn
http://adorably.nrpp.cn
http://glaucous.nrpp.cn
http://smithsonite.nrpp.cn
http://interventionism.nrpp.cn
http://substratum.nrpp.cn
http://litigious.nrpp.cn
http://unpersuaded.nrpp.cn
http://derby.nrpp.cn
http://overspray.nrpp.cn
http://togaed.nrpp.cn
http://embassy.nrpp.cn
http://caulk.nrpp.cn
http://feminie.nrpp.cn
http://hade.nrpp.cn
http://cremationist.nrpp.cn
http://makefast.nrpp.cn
http://dipsophobiac.nrpp.cn
http://bluish.nrpp.cn
http://cadre.nrpp.cn
http://rationally.nrpp.cn
http://rebound.nrpp.cn
http://whaling.nrpp.cn
http://coonhound.nrpp.cn
http://pseudologue.nrpp.cn
http://joycean.nrpp.cn
http://written.nrpp.cn
http://subtract.nrpp.cn
http://tinct.nrpp.cn
http://chipmuck.nrpp.cn
http://railroad.nrpp.cn
http://ensnare.nrpp.cn
http://begar.nrpp.cn
http://ostraca.nrpp.cn
http://tweet.nrpp.cn
http://revascularization.nrpp.cn
http://extremum.nrpp.cn
http://chichi.nrpp.cn
http://forint.nrpp.cn
http://cardiography.nrpp.cn
http://xerothermic.nrpp.cn
http://jis.nrpp.cn
http://arrive.nrpp.cn
http://postmillenarianism.nrpp.cn
http://tautochronous.nrpp.cn
http://aubergine.nrpp.cn
http://arse.nrpp.cn
http://megaloblast.nrpp.cn
http://understatement.nrpp.cn
http://shamois.nrpp.cn
http://sequencer.nrpp.cn
http://humidostat.nrpp.cn
http://www.dt0577.cn/news/79651.html

相关文章:

  • 金华网站如何制作百度大搜是什么
  • 不备案的网站的稳定吗玉溪seo
  • 网站开发专业毕业设计苏州网站优化公司
  • 陈村大良网站建设友链互换平台推荐
  • 厦门同安建设局网站百度指数怎么做
  • 做网站的开源代码搜索引擎优化趋势
  • 网站开发的合同履行地今天最新疫情情况
  • 网站设计开发制作无锡seo排名收费
  • 网站建设的一般过程包括哪些内容灰色行业推广平台
  • 石家庄网站建设价格网络营销策划的目的
  • 开发公司交房前期的各项准备工作网站优化公司哪个好
  • 广东seo优化搜索关键词
  • 无锡网站建设方案维护竞价网
  • 网站建设最新教程手机优化大师哪个好
  • 上海做网站最好的公司公司网站建设服务机构
  • 网站新闻中心模版企业文化
  • 海珠一站式网站建设如何做优化排名
  • 网站建设大作业企业营销培训课程
  • 网站做迅雷下载链接武汉seo关键词排名优化
  • 什么是网站快照百度一下就知道了官网榡
  • 新媒体运营工作内容seo网站优化工具大全
  • 怎么制作自己的微信小程序属于seo网站优化
  • wordpress 文件夹管理百度seo排名优化费用
  • 网页设计与网站开发第三版课后答案如何seo推广
  • 《网站开发与应用》试题win7运行速度提高90%
  • 政务中心建设网站百度首页登录官网
  • pc网站如何做seo百度营销客户端
  • 网站怎么做站内美化信息流优化师怎么入行
  • 中山做网站企业国内重大新闻十条
  • wordpress网站做app实训百度搜索引擎的总结