标签:个数 幻读 形式 查询 竞争 读写 原子类 分类 线程
主要防止幻读,脏读,不可重复读,处理数据库并发。
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算法,并发库里面的原子类其实就是一种乐观锁的实现形式。
a.表级锁的分析:
使用show status like ‘Table%’指令,主要看table_locks_waited,如果这个数目比较大,说明锁的争夺很严重,并发量很大,换成InnoDB试下。
b.行级锁的分析
主要看innodb_row_lock_waits,总共等待次数。
标签:个数 幻读 形式 查询 竞争 读写 原子类 分类 线程
原文地址:https://www.cnblogs.com/JimmyFanHome/p/9912106.html