在计算机的世界里锁(lock)是为了协调多个进程或者多个线程并发的访问同一资源而被创造出来的。而在咱们的mysql数据库中的锁也是为了解决并发访问同一资源的问题,下面我就来介绍下mysql中的锁的一些知识,若是有什么说的不对的地方,还但愿各位大神指正。mysql
在mysql数据库中,能够将锁分为3个种类: 表级锁 、 行级锁 、 页级锁 。sql
定义:对整个表进行加锁处理,在你锁按期间,若是你是读锁,其余进程写操做没法对这张表进行操做。若是你是写锁,则其余进程没法对这张表进行操做。数据库
引擎: MyISAM , InnoDB 并发
优势: 加锁快 、 开销小 、 不会出现死锁 spa
缺点: 锁定面积大 、 发生冲突的几率高 、 并发度低 线程
lock tables table_name1 read local,table_name2 read local; select * from table_name1; select * from table_name2; lock tables;
注意:code
MyISAM存储引擎中有一个系统变量 concurrent_insert ,这个变量能够控制并发插入的行为,容许的值为(0、一、2)。blog
对于MyISAM的锁调度,咱们须要注意的是:索引
优势:由于MyISAM是共享读锁的,先执行写进程,可让读进程积累到必定程度,一块儿读取数据,能够增长并发度队列
缺点:若是写进程过多,那么会形成读进程一致没法执行,致使等待时间过长
能够经过如下几种方法解决读进程等待时间过长的问题:
SET LOW_PRIORITY_UPDATES=1; SET LOW_PRIORITY_INSERT=1; SET LOW_PRIORITY_DELETE=1;
set max_write_lock_count=10;
定义:对表中的一行进行加锁,其余进程还能够操做这张表的其余行。
引擎: InnoDB
优势: 锁定面积小 、 发生冲突的几率低 、 并发度高
缺点: 加锁慢 、 开销大 、 会发生死锁
注意如下几点:
select * from table_name where id = xxx lock in share mode;
InnoDB行锁是经过索引上的索引项来实现的,只有经过索引条件检索数据,InnoDB才会使用行级锁,不然,InnoDB将使用表锁。
当咱们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据的索引项加锁;对于键值在条件范围内但并不存在的记录,叫作“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制不是所谓的间隙锁(Next-Key锁)。
在InnoDB下,使用表锁要注意如下几点:
定义:对表中某行和相邻行进行加锁。这种作法是对表级锁和行级锁的一中折中方案。
引擎:BDB