MyISAM 与InnoDB关于锁方面得区别是什么?
MyISAM默认用的是表级锁,不支持行级锁;
范围查询的时候默认给表上read🔒(共享锁)
1
lock tables students read | write;
write🔒(排他锁)
上锁之后读和写都要等
InnoDB默认用的是行级锁,也支持表级锁;
手动上锁,只对该行上锁;
1
select * from students_innodb where id=3 lock in share mode;
共享锁可以兼容;
当查找不走索引的时候上的是表级锁;
那是不是锁越细越多越好?
🔒越多花费的资源越多;在数据较少的情况下用非聚集索引MyISAM很快
MyISAM适合的场景
- 频繁执行全表count语句;
- 对数据进行增删改的频率不高,查询非常频繁;
- 没有事务;
InnoDB适合的场景
- 增删改查都比较频繁;
- 可靠性要求较高,要求支持事务;
数据库🔒的分类:
- 按照粒度划分:表级锁,行级锁,页级🔒;
- 按照级别划分:共享锁、排它锁;
- 按照枷锁方式:自动锁、显式锁;
- 按操作划分:DML锁、DDL锁;
- 按使用方式划分:乐观锁,悲观锁;
悲观锁:一般用数据库自己带的锁;
乐观锁:使用数据版本控制,只有在增删改查的时候才会去判断冲突;
数据库事务的四大特征:ACID
- A原子性(Atomic)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
事务隔离级别以及各级别下的并发访问问题
MySQL默认是repeatable-read Orcal默认是read-committed
- 更新 丢失———mysql所有事务隔离级别在数据库层面上均可避免;
- eg:存钱失败
- 脏读——设置read-committed事务隔离级别以上可避免;
- 指的是一个session读取了另一个未提交的事务,另一个事务回滚之后造成翻车;
- 解决:set session transaction level read committed;
- 不可重复读——repeatable-read事务隔离级别以上可避免;
- 多次查询结果变化了超出预期;
- 幻读——serializable事务隔离级别可避免;
- Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
当前读和快照读
RR级别下如何避免幻读
Other
讲的很透彻的一篇好文:理解事务的 4 种隔离级别