mysql 锁分类


mysql 锁的分类

MyISAM 和 memory 表级锁 ,innodb 支持行级锁也支持表级锁,默认行级锁,BDB 页面锁,也支持表级锁 按照数据类型来分 读锁(共享锁):针对同一份数据,多个读操作也可以同时进行不会互相影响 写锁(排他锁):当前写操作没有完成前,阻断其他写锁和杜所 按照数据操作粒度分: 表级锁:开销小,加锁快,不会出现死锁,锁粒度大,发生锁冲突的概率最高,并发度最低 行级锁:开销大,加锁慢,会出现死锁,锁粒度最小,发生锁冲突的概率最低,并发度也最高 页面锁:开销和加锁时间介于表所和行所之间,会出现死锁,锁定粒度介于表所和行所之间并发度一般 按照操作性能可分为乐观锁和悲观锁 乐观锁,对记录数据版本进行比对,在数据更新提交时才会进行冲突检测,出现冲突,提示错误信息 代码层次 悲观锁,在对一条数据修改是,为了避免同时被其他人修改,在修改数据之前先锁定,然后修改的控制方式,共享锁和排它锁都是悲观锁的额不同实现,但都是悲观锁的范畴

表级锁

表共享读锁,和表独占写锁,开销小,加锁快,不会出现死锁,锁定粒度大,发出锁冲突的概率最高,并发最低。 lock table read,table write, show open tables where in_use > 0 unlock table

show processlist;kill pid;

表级锁之后,update 无法操作只能等到锁释放才能update

行级锁

innodb 要开启默认RR 事务,才可以使用行级锁
共享锁,其他用户都可以读取数据,任何事务都不能修改,直到释放共享锁
排它锁,如果加上排它锁,事务不能在对数据A加任何类型的封锁,获准排它锁的事务既能读取数据又能修改数据
innodb 默认更新语句,update,delete insert 都会加上排它锁,select语句不会加任何锁,如果要加
共享锁,select * from table_name where ...lock in share mode;
排它锁 select * from table_name where ...for update
行级锁都是基于索引的,如果一条 sql语句用不到是不会使用行级锁的,而是使用表级锁把整张表锁住