设为首页 收藏本站
查看: 712|回复: 0

[经验分享] MySQL——innodb锁

[复制链接]

尚未签到

发表于 2018-10-2 10:18:05 | 显示全部楼层 |阅读模式
  mysql的锁机制比较简单,最显著的特点是不同的存储引擎支持不同的锁机制。innodb支持行锁,有时也会升级为表锁;myisam只支持表锁。
  表锁的特点就是开销小、加锁快;不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度相对低。
  行锁的特点就是开销大、加锁慢;会出现死锁;锁粒度小,发生锁冲突的概率低,并发度也相对较高。
  1、innodb的锁类型:
  主要有:读锁(共享锁)、写锁(排他锁)、意向锁和MDL锁。
  ①:读锁:
  读锁,简称S锁,一个事务获取了一个数据行的读锁,其他事务能获得改行对应的读锁,但不能获得写锁,即一个事务在读取一个数据行时,其他事务也可以读,但不能对该数据行进行行增删改的操作。
  读锁有两种select方式的应用,第一种是自动提交模式下的select查询语句,不需要加任何锁,直接返回查询结果,这就是一致性非锁定读。第二种就是通过select...lock in share mode在被读取的行记录或行记录范围上加一个读锁,让其他事务可以读,但是要想申请加写锁,那就会被阻塞。
  ②:写锁:
  写锁,简称X锁,一个事务获取了一个数据行的写锁,其他事务就不能再获取改行的其他锁,写锁优先级最高。
  写锁的应用就很简单了,一些DML语句的操作都会对行记录加写锁。
  比较特殊的是select  for  update,它会对读取的行记录加上一个写锁,那么其他任何事务就不能对锁定的行加上任何锁了,要不然会被阻塞。
  ③:MDL锁
  mysql5.5引入了meta data lock,简称MDL锁,用于保证表中元数据的信息。在会话A中,表开启了查询事务后,会自动获得一个MDL锁,会话B就不可以执行任何DDL语句的操作。
  不能执行为表中添加字段的操作,会用DML锁来保证数据之间的一致性。
  ④:意向锁
  在mysql  innodb存储引擎中,意向锁就是表级锁。而且有两种意向锁的类型,分别是意向共享锁 和 意向排他锁。
  意向共享锁(IS)是指在给一个数据行加共享锁前必须先取得该表的IS锁。
  意向排他锁(IX)是指在给一个数据行加排他锁前必须先取得该表的IX锁。
  其实意向锁的作用跟MDL类似,都是防止在事务进行过程中,执行DDL语句的操作而导致数据的不一致。
  2、innodb行锁种类:
  innodb的行锁是通过给索引项加锁实现的(也就是说:通过以位图方式对index page加锁机制来实现的。),这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁。也就是说,如果批量update,如果条件的字段没有索引,将会锁表!!!!!如果有索引 只会出现行锁!
  innodb在默认的事务隔离级别为RR,并且参数innodb_locks_unsafe_for_binlog=0的模式下,行锁的种类有三种。
  ①:单个行记录的锁(record lock);注:主键和唯一索引都是行记录的锁模式。在RC隔离级别下,只有record lock记录锁模式;
  ②:间隙锁(GAP lock)
  ③:记录锁和间隙锁的组合叫作next-key lock。(当innodb扫描索引记录时,会先对选中的索引记录加上记录锁,在对索引记录两边的间隙上加上间隙锁)
  注意:
  innodb的行锁其实是加载索引项上面的。!!!!!!!
  RC隔离级别下是允许出现幻读现象的。!!!!!!
  3、锁等待和死锁:
  锁等待:是指一个事务过程中产生的锁,其他事务需要等待上一个事务释放它的锁,才能占用该资源。如果该事务一直不释放,就需要持续等待下去,直到超过了锁等待时间,会报一个等待超时的错误。mysql中通过innodb_lock_wait_timeout参数控制,单位是秒。
  show variables like '%innodb_lock_wait%';   ---查看锁等待超时时间
  死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,就是所谓的锁资源请求产生了回路现象,即死循环。常见的错误时deadlock found when trying to get lock;try restarting transaction.
  innodb存储引擎可以自动检测死锁,并自动回滚该事务。
  避免死锁的方法:
  ①:如果不同程序会并发存取多个表,或者涉及多行记录时,尽量约定以相同的顺序访问表,可以大大降低死锁的机会。
  ②:业务中尽量采用小事务,避免使用大事务,要及时提交或者回滚事务,可减少死锁发生的概率。
  ③:在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生的概率。
  ④:对于非常容易产生死锁的业务部分,可以尝试使用升级锁粒度,通过表锁定来减少死锁产生的概率。
  4、锁监控的方法:
  可以使用:show full processlist 或者 show  engine innodb status命令来判断事务中锁的问题的情况。
  还可以查看3张表:information_schema下的:innodb_trx、innodb_locks、innodb_lock_waits


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607444-1-1.html 上篇帖子: 对MySQL/MariaDB的认知 下篇帖子: MySQL高可用群集
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表