首页 > 代码库 > mysql 事务分析小笔记--01

mysql 事务分析小笔记--01

  最近对有些同学问了我下事务的一些相关知识,在高并发下,事务有什么性能影响? 会不会有堵塞的问题? mysql是如何处理这些的。。。。。突然印象中记得很久之前研究过,可是尼玛,忘了。为了重新捡起知识。于是再次进去了深入分析和学习。平时工作忙比较少写博客,今天开始多学会总结和分享啦。

      开始时候,我们首先得了解事务的ACID四个特征(简单,不需再说),隔离的四个级别,innodb的mvcc(多版本并发控制),redo/undo 等等。

  先说事务隔离级别:

    1.Read Uncommitted(未提交读)                                              ---------> read-uncommitted

    2.Read Committed  (提交读)                                               --------> read-committed

    3.Repeatable Read  (可重读) mysql 默认级别                         ---------> repeatable-read

    4.Serializable   (串行化)注:事务级别最高,串行执行                  ---------> serializable

  说事务隔离区别前,先简单说一下怎么设置系统事务隔离级别和会话事务隔离级别

    查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别

     select @@global.tx_isolation,@@tx_isolation;
 
    更改会话和系统隔离级别
     set session tx_isolation=‘read-uncommitted‘;//值看上面 “--->”部分
     set global tx_isolation=‘read-uncommitted‘;  //值看上面"--->"部分

 

     下面以单词首字母作为简称分析:

    1、RU 未提交读

   容易造成脏数据:

    A 和 B 两个实例作为例子

           A:技术分享

 

           B:技术分享

    认真看看,尼玛,AB开了未提交隔离模式,B就直接读取A中没有添加的插入那行了。造成了严重的脏数据。提交读,可以帮你解决这个问题。

     2、RC (提交读)

   A:技术分享

     B:技术分享

         A插入新行,可是在事务B里查询两次,两次结果不一样,明显出现了不可重复读的情况。前后两次不一致。重复读可以给你解决这个问题。

  3、RR (可重复读)

       A:技术分享

      B: 技术分享

  呵呵,A新增了一行,并且commit,可是在B的事务里,前后两次数据并没有变化。(mysql默认事务隔离级别)

      但是这会有出现一种幻读现象,比如,A事务插了一条,B事务由于查询前后不变,当B去插同一条时候,会报错。

     这个是mysql最常用类型。

  4、Serializable   (串行模式)

      技术分享

      A 事务并没有添加的时候,B根本不能往里面插数据。。。。。。

  这种类型,无论是从效率来说还是从实质来说,应用场景不多。

  (试着类型时候,记得把autocommit 关了,不然没有效果) set autocommit=off

  呵呵,从以上四种事务级别来说不同有不同应用。下次讲讲mvcc的,适合RC RR 。    

 

----------小龙说法,有不同观点有不同见解可以留下意见哈。

 

 

技术分享

mysql 事务分析小笔记--01