介绍
为什么有事务隔离性?因为要并发执行,数据安全性和一致性和并发效率问题
串行化:锁实现,没有并发性
用的多的是可重复读(mysql)和已提交读(oracle),因为权衡了数据安全性和一致性以及并发效率,采用 MVCC
多版本并发控制机制实现
- 表级锁:对整张表加锁。开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低。
- 行级锁:对某行记录加锁。开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。
InnoDB
支持行级锁,MyISAM
只支持表级锁
InnoDB行级锁
行级锁
InnoDB
存储引擎支持事务处理,表支持行级锁定,并发能力更好。
1、InnoDB 行锁是通过给索引上的索引项加锁来实现的,而不是给表的行记录加锁实现的,这就意味着只有通过索引条件检索数据,InnoDB才使用行级锁,否则InnoDB 将使用表锁。(如果不用索引,全表搜索的话行锁意义就没了,开销太大)
2、由于InnoDB的行锁实现是针对索引字段添加的锁,不是针对行记录加的锁,因此虽然访问的是 InnoDB 引擎下表的不同行,但是如果使用相同的索引字段作为过滤条件,依然会发生锁冲突,只能串行进行,不能并发进行。
3、即使SQL中使用了索引,但是经过MySQL的优化器后,如果认为全表扫描比使用索引效率更高,此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引。