1. Read Uncommitted(读取未提交内容)是指一个事务可以看到另外一个事务尚未提交的修改。
  2. Read Committed(读取提交内容)是指一个事务只能看到已经提交的事务的修改。 这意味着如果在事务执行过程中有别的事务提交了,那么事务还是能够看到别的事务最新提交的修改。
  3. Repeatable Read(可重读)是指在这一个事务内部读同一个数据多次,读到 的结果都是同一个。这意味着即便在事务执行过程中有别的事务提交,这个事务依旧看不到别的事务提交的修改。这是 MySQL 默认的隔离级别。
  4. Serializable(可串行化)是指事务对数据的读写都是串行化的。

默认是 RR 历史原因,如果没有项目使用,直接改 RC

Serializable,串行性能太低不用

RU 读未提交,保证不了一致性不用

隔离级别与读异常 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读已提交 不可能 可能 可能
可重复读 不可能 不可能 不可能(理论上可能)
如果手动 select for update,强制当前读就出现了
串行化 不可能 不可能 不可能

调优

  1. 刷盘
  2. 事务隔离
  3. query cache
  4. buffer pool 实例数量,大小
参数 作用 具体值 关注点
innodb_flush_log_at_trx_commit MySQL InnoDB 引擎redo log的刷盘时机 0/2 性能
1 数据不丢
sync_binlog MySQL binlog的刷盘时机 N(N>1,表示每多少个事务刷新一次) 性能
1 数据不丢
transaction-isolation 调整隔离级别 TRANSACTION_READ_UNCOMMITTED 读未提交
TRANSACTION_READ_COMMITTED 读已提交
TRANSACTION_REPEATABLE_READ 可重复读
TRANSACTION_SERIALIZABLE 串行化