MySQL中各种锁的划分以及优缺点简析

MyISAm存储引擎只支持表锁:

表锁这种锁在对表数据进行修改时,会锁定整张表,这样的好处时,资源消耗少,毕竟控制住一头大象比控制住大象的尾巴要容易的多。缺点是并发能力差。同一时间大量请求过来,但是每次都要锁住整张表的资源,其他的请求只能进行等待。

Innodb存储引擎即支持行锁也支持表锁:

行锁这种锁在对表数据进行修改时,定位到某一行的数据进行锁定。多个请求过来,要修改的数据如果不同是不用等待的。并发能力上去的同时,代价就是资源消耗大。

 

表锁是不会出现死锁的。

所谓死锁:

比如有两个事务:

事务A:

begin;
UPDATE `user` set username='shusheng' WHERE id='003';
UPDATE `user` set username='langzu' WHERE id='004';
commit;

 

 事务B:

begin;
UPDATE `user` set username='daxiong' WHERE id='004';
UPDATE `user` set username='xiaodingdang' WHERE id='003';
commit;

 

 如果两个线程同时执行,当每个线程执行自己事务第一句的时候是不会有问题的,但是当执行第二句时,如果使用的是行锁,事务A要拿的id='004'这一行的锁由于在事务B中还没有释放,同样,事务B要拿的id='003'这一行的锁在事务A中没有释放。

就会出现互相等待对方释放锁的情况。这个就是死锁。

innodb对死锁的解决方案是对修改行数最少的事务进行回滚。这样做的原因是这种处理方式代价最小。

InnoDB对于通常使用的update,insert,delete默认是使用的表锁,对于select不使用锁。

但是可以显示声明

¡  共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

¡  排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

 

对于行锁,InnoDB是通过对索引上的索引项加锁来实现的。所以索引,是innodb使用行锁的前提!当不使用索引时,innoDB使用的表锁。

posted @ 2018-04-17 13:28  一介書生  阅读(914)  评论(0)    收藏  举报