锁模块的常见问题
- MyISAM与Innodb在锁方面的区别是什么
- 数据库四大事务的特性什么
- 事务隔离级别以及各级别下并发访问问题
- Innodb可重复读级别下如何避免幻读
- RC、RR级别下的Innodb的非阻塞读如何实现
MyISAM锁
MyISAM的锁是表级锁,无论读锁还是更新锁都会锁住整张表,并且是互斥的,如在存储引擎为MyISAM的表中先执行一个大数据量的查询,在查询过程中在执行更新操作,则更新操作会等待查询完毕,释放完读锁之后才可以加上更新锁,从而验证上述MyISAM的锁特性
读锁也称为共享锁,一个session在读的过程中另一个session也可以进行读操作
MyISAM的存储引擎的表不支持事务
Innodb锁
- innodb是默认为行级锁,且事务默认为自动提交(show variables like ‘%autocommit%’)
- innodb上共享锁的语句(select * from TB_x where id=3 lock in share mode)
- innodb在查询未用到索引的时候使用的是表级锁
MyISAM与Innodb的适用场景
MyISAM的适应场景如下
- 频繁执行全表count语句
- 对数据增删改频率不高,查询非常频繁
- 无事务
Innodb的适应场景如下 - 增删改相当频繁
- 可靠性要求比较高,要求支持事务
数据库锁的分类
- 按锁的粒度划分,可分为行级锁、表级锁、页级锁
- 按锁级别划分,可分为共享锁、排他锁
- 按加锁方式划分,可分为自动锁、显示锁(lock in shar mode OR for update)
- 按操作划分,可分为DML锁、DDL锁
- 按使用方式划分为悲观锁、乐观锁
悲观锁与乐观锁的实现
悲观锁
- 悲观锁是对数据提前进行加锁,依赖于数据库层面,对其他事务呈保守策略,故在高并发情况下影响效率
乐观锁
- 乐观锁是在表中引入version字段,每次更新操作之前先查询出version号,更新时以该version字段作为条件,若不一致则更新失败,说明此session数据以过期,根据逻辑处理要求重新更新