码迷,mamicode.com
首页 > 数据库 > 详细

数据库的锁机制

时间:2018-11-05 23:36:00      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:个数   幻读   形式   查询   竞争   读写   原子类   分类   线程   

 

  1.数据库的锁作用

    主要防止幻读,脏读,不可重复读,处理数据库并发。

  2.锁的分类    

    a.根据锁的粒度来分,有行级锁以及表级锁。

      <1>表级锁:MyIsam就是用的表级锁,它是偏向读的,在执行select查询操作的时候,会自动给涉及的表加上读锁,总所周知,读锁会阻塞写,所以当一个线程在读时,其他人是可以读这个表的,但是,如果是写,不管是当前线程还是其他线程都不行。所以,MyIsam这个引擎,不适合写多的场合。

      <2>行级锁:InnoDB引擎使用的就是行级锁,偏向写,当操作当前行时,其他线程不能读写该行。当索引失效时,行级锁会升级为表级锁。这里还有个小问题就是间隙锁,比如说,我有1,2,4,5这四行数据,但是当我行级锁锁定一个范围比如说1-5,它会把第三行这个不存在的行也锁定,其他线程想插入也插入不了。

    b.按照对待并发的数据角度来说,有悲观锁和乐观锁。

      <1>悲观锁:它是每次去操作数据时,都会默认有其他线程在竞争,会先上锁,比如说,锁定某一行的操作:select * from account where name=”Erica” for update,加上这个for update,就会加上行级锁,先上锁再操作。

      <2>乐观锁:它就比较乐观,每次去操作数据,它觉得没人和他争,先尝试去操作,不成功再尝试,适合读比较多的业务场景。实现方式有两种,一种是用一个version字段,每一次的操作都会更新version,提交时如果version不匹配,停止本次提交,可以尝试下一次的提交,以保证拿到的是操作1提交后的结果。

还有一种就是著名的CAS算法,并发库里面的原子类其实就是一种乐观锁的实现形式。

  3.锁的分析

    a.表级锁的分析:

      使用show status like ‘Table%’指令,主要看table_locks_waited,如果这个数目比较大,说明锁的争夺很严重,并发量很大,换成InnoDB试下。

    b.行级锁的分析

      主要看innodb_row_lock_waits,总共等待次数。

数据库的锁机制

标签:个数   幻读   形式   查询   竞争   读写   原子类   分类   线程   

原文地址:https://www.cnblogs.com/JimmyFanHome/p/9912106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!