表级锁和行级锁
大约 3 分钟
表级锁和行级锁
事务隔离级别的实现原理:简单来说就是各种锁机制和MVCC多版本并发控制
我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个知识
我们说到事务,就得说到事务的ACID特性,为什么需要隔离性呢?因为事务要能够允许并发执行,并发执行为了同时保证数据的安全性,一致性和并发的效率,就需要设置事务的隔离级别
一、事务隔离机制的选择

如果我们,使用未提交读的事务隔离机制,任由这些线程并发操作数据库,那就会出现脏读(读取了未commit的数据)、不可重复读(两次查询值不同)、幻读(两次查询数据量不同)等问题,数据的安全性最低,优点是并发效率非常高,
如果我们串行化(),,虽然数据的安全性提高了,并发的效率就太低了,
所以我们一般用的是已提交读、可重复读这两个隔离级别,平衡了数据的安全性,一致性以及并发的效率 ,是由并发控制实现的(MVCC是已提交读和可重复读的原理,锁是串行化的原理)
二、表级锁&行级锁
表级锁:对整张表加锁。开销小(因为不用去找表的某一行的记录进行加锁,要修改这张表,直接申请加这张表的锁),加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低
行级锁:对某行记录加锁。开销大(需要找到表中相应的记录,有的过程),加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高

InnoDB存储引擎支持事务处理,表支持行级锁定,并发能力更好
- InnoDB行锁是通过给索引上的来实现的,
而不是给表的行记录加锁实现的,这就意味着 - 由于InnoDB的行锁实现是针对索引字段添加的锁,不是针对行记录加的锁,因此虽然访问的是InnoDB引擎下表的不同行,但如果使用相同的索引字段作为过滤条件,依然会发生锁冲突,只能串行进行,不能并发进行
- 即使SQL中使用了索引,但是经过MySQL5.7的优化器后,如果认为全表扫描比使用索引效率高,此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引