这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
数据库并发场景
- 读-读:不存在任何问题,也不需要并发控制;
- 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读;
- 写-写:有线程安全问题,可能会存在更新丢失问题。
多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。
MVCC 可以为数据库解决以下问题
- 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能;
- 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。
行锁和表锁
MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
InnoDB 存储引擎的锁的算法
- Record lock:单个行记录上的锁;
- Gap lock:间隙锁,锁定一个范围,不包括记录本身;
- Next-key lock:record+gap 锁定一个范围,包含记录本身。
问题排查都有哪些手段?
- 使用 show processlist 命令查看当前所有连接信息;
- 使用 Explain 命令查询 SQL 语句执行计划;
- 开启慢查询日志,查看慢查询的 SQL。
如果mysql数据库 CPU 飙升到 500% 怎么处理?
- 列出所有进程 show processlist,观察所有进程,多秒没有状态变化的(干掉);
- 查看超时日志或者错误日志 (一般会是查询以及大批量的插入会导致 CPU与 I/O 上涨,当然不排除网络状态突然断了,导致一个请求服务器只接受到一半。