《MySQL锁问题》要点:
本文介绍了MySQL锁问题,希望对您有用。如果有疑问,可以联系我们。
MySQL的锁机制比拟简单,不同的存储引擎支持的不同的锁机制.如:MyISAM和MEMORY存储采用表级锁(table-level locking),BDB存储引擎采用的是页面锁(page-level locking),InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下采用的是行级锁.
三种锁的特性大致如下:
表级锁:开销小,加锁快;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发粒度最低;
页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间;并发度一般;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发读也最高;
以上的特性主要是因为锁模式决定的,在MySQL中锁模式分为两种:共享锁(读锁)和独占锁(写锁).
1)以表级锁来分析锁模式:
当数据表已经被其中一个连接获得了读锁,不会阻塞其他连接对这个表的读哀求,但是如果有其他连接需要进行写入,因为该表已经被设置读锁了,其他连接是不能获得写锁的,需要等待所有的读锁释放,它才能获得写锁.
而如果一个表已经被一个连接获得写锁,它会阻塞所有其他哀求对这个表的读哀求和写哀求,直至这个写锁被释放.
2)以行级锁来分析锁模式:
锁模式的原理跟上述描述的表级锁是一样的,只是它是根据行的粒度来设置锁的.如果某一行被写锁了,它是不会阻塞其他连接对另外行的写哀求的.
因为MySQL从5.5.5开始默认的存储引擎是InnoDB,了解InnoDB的行级锁对我们索引的优化也是一个非常大的赞助.那么MySQL是根据什么来设置行锁的范围的呢?
答案是索引,如果SQL执行计划是依照某个索引进行的,那么他会根据该索引关联到的行进行锁定.如果SQL执行计划没有利用到索引,那么就是整个表锁定了.表锁是个很恐怖的东西,如果数据库有大量更新操作的时候,那么数据库的并发性能将大大降低.
所以索引不但是单存影响查询的效率,在并发性能上也是一个大问题.
《MySQL锁问题》是否对您有启发,欢迎查看更多与《MySQL锁问题》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7662.html