您的位置:首页 > 数据库 > MySQL

mysql 事务分析小笔记--01

2016-10-31 20:03 190 查看
  最近对有些同学问了我下事务的一些相关知识,在高并发下,事务有什么性能影响? 会不会有堵塞的问题? 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;

  呵呵,从以上四种事务级别来说不同有不同应用。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: