Mysql的表级锁和行级锁

表级锁

MySQL表级锁分为读锁和写锁。sql

读锁

用法:LOCK TABLE table_name [ AS alias_name ] READ数据库

释放锁使用UNLOCK tables.能够为表使用别名,若是一旦使用别名在使用的时候也必须采用别名。成功申请读锁的前提是当前没有线程对该表使用写锁,不然该语句会被阻塞。申请读锁成功后,其余线程也能够对该表进行读操做,但不容许有线程对其进行写操做,就算是当前线程也不容许。当锁住了A表以后,就只能对A表进行读操做,对其余表进行读操做会出现错误(tablename was not locked with LOCK TABLES)并发

写锁

用法: LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE线程

一样也可使用别名,与读锁不一样的是,写锁中能够指定锁的优先级。LOW_PRIORITY是一种比读锁更低优先级的锁,当多个线程同时申请多种锁(LOW_PRIORITY,READ,WRITE)时,LOW_PRIORITY的优先级最低。读锁申请成功的前提是没有线程对表加读锁和其余写锁,不然会被阻塞。索引

表级锁在MyISAM和innoDB中都有用到,建立锁的开销小,不会出现死锁,因为锁定的是整张表,因此并发度低。当须要频繁对大部分数据作 GROUP BY 操做或者须要频繁扫描整个表时,推荐使用表级锁。内存

行级锁

行级锁是Mysql中锁定粒度最细的一种锁,能大大减小数据库操做的冲突,因为其粒度小,加锁的开销最大。行级锁分为共享锁和排他锁。

共享锁(S LOCK)

用法:SELECT ...LOCK IN SHARE MODE;
Mysql会对查询结果中的每行都加共享锁,当没有其余线程对查询结果集中的任何一行使用排他锁时,能够成功申请共享锁,不然会被阻塞。其余线程也能够读取使用了共享锁的表,并且这些线程读取的是同一个版本的数据。

排他锁(X LOCK)

用法:SELECT ...LOCK FOR UPDATE;
Mysql会对查询结果中的每行都加排他锁,当没有其余线程对查询结果集中的任何一行使用排他锁时,能够成功申请排他锁,不然会被阻塞。
行级锁都是基于索引的,若是一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:因为须要请求大量的锁资源,因此速度慢,内存消耗大。
相关文章
相关标签/搜索