永远不要跟别人比幸运,我从来没想过我比别人幸运,我也许比他们更有毅力,在最困难的时候,他们熬不住了,我可以多熬一秒钟、两秒钟,甚至更久。

Mysql 锁机制和表锁详解

数据库 新民 1392℃ 已收录 3评论

1、什么是锁?

锁是协助计算机协调多个进程或线程并发访问某一资源的机制;

在数据库中,除传统的计算机资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用     户共享的资源,如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也     是影响数据并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言显得尤其重要,也更加复     杂。

2、锁的分类:

从对数据操作的类型来分(读锁和写锁):

  • 读锁(共享锁):针对同一份数据,多个操作可以同时进行而不会互相影响;
  • 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁;

从对数据操作的粒度分(表锁和行锁)。

3、三锁:

  • 表锁(偏读):
  • 特点:偏向MyISAM 存储引擎,开销小,枷锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。

手动增加锁:

语法:lock table 表名  read(write),表名2 read(write),其他;

查看表上加过的锁:

Show  open tables;

 

若,In_use 为0,则表示对应的数据表没有没有锁。1表示锁了。

假如给user表 加读锁,book 表加写锁:

           LOCK TABLE USER READ,book WRITE; 、

加完锁后,在使用命令:show open tables; 来看相信的表是否有锁:

很明显 user 表和  book 表已经成功枷锁了。

 

  • 表锁分析:

如何分析表锁定?

可以通过检查 table_locks_waited 和 table_locks_immediate 状态变量来分析系统上的表锁定。

SQL语句:

Show status like ‘table%’;

 

这里有两个状态变量记录Mysql 内部标记锁定的情况,两个变量说明情况如下:

Table_locks_immediate : 产生表级锁定的次数,可以表示立即获取锁的查询次数,每立即获取锁值增加1;

Table_locks_waited : 出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值增加1),此值高则说明存在着较严重的表级争用情况;

此外,MyISAM 存储引擎的读写锁调度是写优先,这也是MyISAM 存储引擎不适合做写为主表的引擎。因为写锁后,其他线程不做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。

行锁(偏写):

由于本文章的内容太多,将在下个文章中介绍;

页锁(表锁和行锁两者之间)

 

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://www.snowruin.com/?p=1681
喜欢 (3)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)条精彩评论。
  1. 朋友 交换链接吗
    老蒋博客2018-01-25 10:47 回复| Google Chrome 55.0.2883.87| Windows 8.1 x64
    • 新民
      可以
      新民2018-01-27 17:13 回复| Google Chrome 63.0.3239.132| Windows 7 x64
  2. 风神博客来访·http://fsboke.cn/,欢迎回访 😳
    风神博客2017-05-28 22:15 回复| Google Chrome 49.0.2623.221| unknow