在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减小数据库操做的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。sql
共享锁又称读锁,是读取操做建立的锁。其余用户能够并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放全部共享锁。数据库
若是事务T对数据A加上共享锁后,则其余事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。并发
SELECT ... LOCK IN SHARE MODE;
spa
在查询语句后面增长LOCK IN SHARE MODE
,Mysql会对查询结果中的每行都加共享锁,当没有其余线程对查询结果集中的任何一行使用排他锁时,能够成功申请共享锁,不然会被阻塞。其余线程也能够读取使用了共享锁的表,并且这些线程读取的是同一个版本的数据。线程
排他锁又称写锁,若是事务T对数据A加上排他锁后,则其余事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。code
SELECT ... FOR UPDATE;
事务
在查询语句后面增长FOR UPDATE
,Mysql会对查询结果中的每行都加排他锁,当没有其余线程对查询结果集中的任何一行使用排他锁时,能够成功申请排他锁,不然会被阻塞。get
InnoDB还有两个表锁:date
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁数据
意向排他锁(IX):相似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
意向锁是InnoDB自动加的,不须要用户干预。
对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于通常的Select语句,InnoDB不会加任何锁,事务能够经过如下语句给显示加共享锁或排他锁。
共享锁:SELECT ... LOCK IN SHARE MODE;
排他锁:SELECT ... FOR UPDATE;