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学院为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |