mysql的表锁和行锁,排他锁和共享锁。
1、表锁和行锁
表锁和行锁锁的粒度不一样,表锁锁住的是一整张表,行锁锁住的是表中的一行数据,行锁是开销最大的锁策略,表锁是开销最小的锁策略。
InnoDB使用的是行级锁,MyISAM使用的是表级锁。
注意:在InnoDB中,例如模糊查询select * from tb where name like 'lin%'的时候也会锁住一整张表。
2、共享锁和排他锁
共享锁又称读锁(S锁),一个事务获取了共享锁,其他事务可以获取共享锁,不能获取排他锁,其他事务可以进行读操作,不能进行写操作。
排他锁又称写锁(X锁),如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);
对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。
共享锁:SELECT ... LOCK IN SHARE MODE;
排他锁:SELECT ... FOR UPDATE;
共享锁例子:
事务一:使用lock in share lock获取共享锁,开始事务,不提交也不回滚
事务二:对同一条记录进行修改,会产生阻塞,查询不会阻塞
事务三:对同一记录进行查询(加共享锁),不阻塞,共享锁允许其他事务也获取共享锁
排他锁例子:
事务一:select语句后跟for update获取排他锁,其他事务不能进行查询和修改的操作
事务二:对同一记录进行加锁查询会被阻塞
事务三:对该记录的加锁写操作会阻塞
参考网址:http://www.hollischuang.com/archives/923