MySQL中的锁:
从锁定粒度上区分为:表级锁,页级锁,行级锁。
- 表级锁:
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度低。
代表引擎是MyISAM引擎。
表级锁定分为:表共享读锁(共享锁)与表独占写锁(排他锁)。
注:
开销小:指加锁资源消耗较少
锁定粒度大:指锁的级别,最小的行级锁,最大的表锁。
锁冲突高:因为针对整个表加锁,除非没有其他人操作否则冲突。 - 页级锁(不详解):
特点:优缺点介于表级锁和行级锁之间,粒度为相邻一组数据行。
代表引擎是BDB引擎。 - 行级锁:
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度也最高。
代表引擎是InnoDB引擎。InnoDB也支持表级锁,默认为行级锁
行级锁分为:共享锁和排他锁
注:
死锁:两个进程同时操作一组数据,相互争夺控制权,造成相互等待若无外力不继续进行一直等待的现象,称之为死锁。
当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。
行锁与表锁:InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁