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锁会用在非唯一索引或者不走索引的当前读中