MySql 锁机制

来源:互联网 发布:暴走漫画淘宝 编辑:程序博客网 时间:2024/06/14 17:47

根据对数据的操作类型可以将锁划分为读锁和写锁。
    读锁(共享锁):针对一份数据,多个读操作可以同时进行而不互相影响。
    写锁(排他锁):当前写操作没有完成前,会阻断其他写锁和读锁。

根据对数据操作的粒度划分可以划分为表锁和行锁以及页锁。
    表锁(偏读):偏向于MyISAM 存储引擎,开销小,加锁快,无死锁,锁颗粒度大,发生所冲突的概率很高,并发度很低。MyISAM 的读写调度是写优先,这也是MyISAM 为什么不适合做写为主的表的引擎,因为写锁后,其他线程不能做任何的操作,大量的更新数据会使查询很难得到锁,从而造成阻塞。
对MyISAM表进行操作,会有以下情况:
    1]:对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
    2]:对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
    简而言之就是读锁会阻塞写,但是不会阻塞读。而写锁会阻塞读和写操作。

    行锁:偏向于InnoDB 存储引擎,开销大,加锁慢,会出现死锁,锁颗粒度很小,发生锁冲突的概率低,因此并发程度很高。

    页锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁颗粒度介于表锁和行锁之间,并发程度一般。