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

猜你喜欢

转载自www.cnblogs.com/shamgod-lct/p/9318032.html