数据库锁的分类
- 按锁的颗粒度分,可分为表级锁,行级锁,页级锁(颗粒由小到大)
- 按锁级别划分,可分为共享锁、排他锁
- 按加锁方式分,可分为自动锁、显示锁(for update 操作等)
- 按操作划分、可分为DML锁(CRUD操作的),DDL锁(表结构变更的)
- 按使用方式划分、可分为乐观锁,悲观锁
共享锁 | 排他锁 | |
---|---|---|
共享锁 | 兼容 | 冲突 |
排他锁 | 冲突 | 冲突 |
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
MyISAM与InnoDB关于锁方面的区别
- MyISAM默认用的是表级锁,不支持行级锁
- InnoDB默认使用的行级锁,也支持表级锁
表级锁会将整表锁住,不需要具体到某一行因此开销小
行级锁会锁住某一行数据,会造成死锁
锁的出现是多个事务同时操作同一张表,或者同一行数据。
MyISAM引擎进行select查询的时候会对表加上读锁(共享锁不影响其他事务上读锁),其他事务进行update操作为表加上写锁(排他锁,上了锁之后其他锁无法加上),需要等待读锁致性完成。
InnoDB在默认执行select操作的时候不会上共享锁。InnoDB在查询的时候如果是走索引是走的行级锁,如果是不走索引走的是表级锁。
MyISAM适合的场景
- 频繁执行全表count语句
- 对数据进行增删改的频率不高,查询频繁
- 没有事务
InnoDB适合的场景
- CRUD频繁
- 可靠性要求高,需要支持事务
数据库的四大特性
- 原子性
- 一致性
- 隔离性
- 持久性
事务隔离机制
事务隔离级别从小到大
事务隔离级别 | 更新丢失 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读(read-uncommited) | 避免 | 发生 | 发生 | 发生 |
已提交读(read-commited) | 避免 | 避免 | 发生 | 发生 |
可重复读(repeatable-read) | 避免 | 避免 | 避免 | 发生 |
串行(serializable) | 避免 | 避免 | 避免 | 避免 |