1. 如何更改隔离级别

      select version(); — 查当前 MySQL 版本号

    如果是 5.6 及其更早的版本

    set global tx_isolation=’read-uncommitted’; set global tx_isolation=’read-committed’; set global tx_isolation=’repeatable-read’; set global tx_isolation=’serializable’;

    5.7 以及更早的版本

    set global transaction_isolation=’read-uncommitted’; set global transaction_isolation=’read-committed’; set global transaction_isolation=’repeatable-read’; set global transaction_isolation=’serializable’;

    1. 为什么要改隔离级别

    首先我们知道 MySQL 的默认隔离级别是 RR,但是在互联网项目中一般都用 RC。可是 RC 不是存在不可重复读和幻读吗?好 我们接下来慢慢分析。
    Oracle 和 SqlServer 的默认隔离级别都是 RC,为什么 MySQL 的确是 RR呢? 这是由历史原因的。我们要从 主从复制开始说。 Binlog 有三种格式:分别是 statement(记录的是修改语句),row(几乎的是每行实际数据的变更),mixed(statement 和 row 的混合模式)。
    在 MySQL 5.0 版本前,binlog 只支持 statement 这种格式,而这种格式在 RC 这个隔离级别下主从复制是有 bug 的,因此 MySQL 将可重复读作为默认的隔离级别。这是什么 Bug 呢?
    在主从复制的过程中 如果 master 上先执行删除后执行插入,而因为 binlog 为 statement 格式,它记录的顺序是先插入后删除!从 slave 同步的是 binlog,因此从机执行的顺序和主机不一致!

    解决方案有两种!
    (1)隔离级别设为可重复读(Repeatable Read),在该隔离级别下引入间隙锁。当Session 1执行delete语句时,会锁住间隙。那么,Ssession 2执行插入语句就会阻塞住!
    (2)将binglog的格式修改为row格式,此时是基于行的复制,自然就不会出现sql执行顺序不一样的问题!奈何这个格式在mysql5.1版本开始才引入。因此由于历史原因,mysql将默认的隔离级别设为可重复读(Repeatable Read),保证主从复制不出问题!

    参考
    https://www.cnblogs.com/shoshana-kong/p/10516404.html