在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取到的是同一个版本的数据
2. 排他锁排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获取排他锁的事务既能读数据,又能修改数据
用法:SELECT ... FOR UPDATE 。在查询语句后面增加FOR UPDATE,MySQL会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞
3. 意向锁意向锁是表级锁,其设计目的是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB中的两个表锁:
意向共享锁(IS):表示事务准备给数据行加入共享锁,也即是说一个数据行加共享锁前必须先取得该表的IS锁
意向排他锁(IX):表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先去的该表的IX锁
意向锁是InnoDB自动加的,不需要用户干预
总结对于insert,update,delete,InnoDB会自动给涉及到的数据加排他锁;对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显式加上共享锁或排他锁
共享锁:select ... LOCK IN SHARE MODE
排他锁:SELECT ... FOR UPDATE