【事务隔离级别】说说项目中选择的事务隔离级别

查了一下自己项目中MySQL事务隔离级别 和binlog格式分别是

select @@tx_isolation,@@global.tx_isolation,@@binlog_format,@@global.binlog_format;
-- READ-COMMITTED,READ-COMMITTED,ROW,ROW

事务隔离级别有

  • 读未提交(Read UnCommitted)
  • 读已提交(Read Commited) 简称RC
  • 可重复读(Repeatable Read) 简称RR
  • 串行化(Serializable)
    binlog支持格式
  • statement:记录的是修改SQL语句
  • row:记录的是每行实际数据的变更 从MySQL5.1版本开始引入
  • mixed:statement和row模式的混合

为什么MYSQL默认采用 可重复读(Repeatable Read) 隔离级别?
MySQL5.0之前只支持statement格式,但这种格式在RC下 主从复制有bug,

什么bug?
解决方案有两种:

  1. 隔离级别设置为RR
  2. binglog的格式修改为row格式,

为什么是READ-COMMITTED + ROW?

  1. 在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多
  2. 在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行
    此时执行语句
  3. 在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!
    在5.1.15的时候,innodb引入了一个概念叫做“semi-consistent”,减少了更新同一行记录时的冲突,减少锁等待。

binlog日志怎么看?

参考

posted @ 2020-07-08 14:38  zendwang  阅读(102)  评论(0)    收藏  举报