MyISAM与InnoDB关于锁方面的区别是什么
- MyISAM默认用的是表级锁,不支持行级锁
- lock tables table_name read | write; myisam加锁
- unlock tables;
- select * from table_name for update;读锁上排它锁
- InnoDB默认用的是行级锁,也支持表级锁
- show variables like 'autocommit'; set autocommit = 0; #关闭自动提交
- select * from table_name where id = ? lock in share mode; 为查询语句加锁
MyISAM使用场景
- 频繁执行全表count语句
- 对数据进行增删改的频率不高,查询非常频繁
- 没有事务
InnoDB适合的场景
- 数据增删改查都相当频繁
- 可靠性要求比较高,要求支持事务
数据库锁的分类
- 按锁的粒度划分,可分为表级锁、行级锁、页级锁
- 按锁级别划分,可分为共享锁、排它锁
- 按加锁方式划分、可分为自动锁、显式锁
- 按操作划分,可分为DML锁,DDL锁
- 按使用方式划分,乐观锁,悲观锁
数据事务的四大特性
ACID
- 原子性(Atomic)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
事务并发访问引起的问题以及如何避免
- 更新丢失--mysql所有事务隔离级别在数据库层面均可避免
- 脏读--READ-COMMITTED事务隔离级别以上可以避免
- 不可重复读--REPEATABLE-READ事务隔离级别以上可避免
- 幻读--SERIALIZABLE事务隔离级别可避免(事务A读取与搜索条件匹配的若干行,事务B以插入或删除行的方式修改事务A的结果集,导致事务A像出现幻觉一样)
InnoDB可重复读隔离级别下如何避免幻读
- 表象:快照读(非阻塞读)--伪MVCC
- 内在:next-key锁(行锁+gap锁)
当前读和快照读
- 当前读:select ... lock in share mode, select ... for update
- 当前读:update, delete, insert(读取记录的最新版本,还要求其他事务不能修改当前记录)
- 快照读:不加锁的非阻塞读,select
show variables like 'autocommit';#查看当前事务是否是自定提交
SET autocommit = 0;#关闭自动提交
select @@tx_isolation;#查看事务的隔离级别
RC、RR级别下的InnoDB的非阻塞读如何实现
- 数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
- undo日志
- read view
next-key锁(行锁+gap锁)
对主键索引或唯一索引会用Gap锁吗
- 如果where条件全部命中,则不会用Gap锁,只会加记录锁
- 如果where条件部分命中或全不命中,则会加Gap锁
Gap锁会用在非唯一索引或者不走索引的当前读中