mysql 并发场景

363 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

数据库并发场景

  1. 读-读:不存在任何问题,也不需要并发控制;
  2. 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读;
  3. 写-写:有线程安全问题,可能会存在更新丢失问题。

多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。

MVCC 可以为数据库解决以下问题

  1. 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能;
  2. 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

行锁和表锁

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

InnoDB 存储引擎的锁的算法

  1. Record lock:单个行记录上的锁;
  2. Gap lock:间隙锁,锁定一个范围,不包括记录本身;
  3. Next-key lock:record+gap 锁定一个范围,包含记录本身。

 问题排查都有哪些手段?

  1. 使用 show processlist 命令查看当前所有连接信息;
  2. 使用 Explain 命令查询 SQL 语句执行计划;
  3. 开启慢查询日志,查看慢查询的 SQL。

如果mysql数据库 CPU 飙升到 500% 怎么处理?

  1. 列出所有进程 show processlist,观察所有进程,多秒没有状态变化的(干掉);
  2. 查看超时日志或者错误日志 (一般会是查询以及大批量的插入会导致 CPU与 I/O 上涨,当然不排除网络状态突然断了,导致一个请求服务器只接受到一半。