zoukankan      html  css  js  c++  java
  • MySql事务隔离级别 浅见

            SQL标准定义的4类隔离级别

    1. Read Uncommitted(读取未提交内容)
    2. Read Committed(读取提交内容,读取已提交
    3. Repeatable Read(可重读)
    4. Serializable(可串行化) 
    • 在Mysql innodb数据库引擎下不管是那个事务级别,只要更新同一个数据,都会串行执行。
    • 事务隔离级别可以设置会话级别和全局级别
    • Read Uncommitted级别下,会话A在未提交事务的情况下,对数据做的任何更改(更新,删除,新增),其他会话都能看到。所以会有赃读的问题,不可重复读,幻读的问题
    • Read Committed(读取提交内容,读取已提交),在这个事务级别下解决了赃读的问题,所以任何会话都获取不到其他会话未提交的内容。但是存在不可重复读的问题。就是说在会话A的事务中,第一次查询数据和第二次查询之间,如果其他会话更新并提交了更改,那么会话A中两次查询的结果可能会不一样,这就是不可重复读,因为重复读可能结果不一一样。在互联网的应用中应该设置为这个级别,因为我们在大部分的业务情况下,存在不可重复读不会影响我们的业务,不会对最终结果造成影响。并且这个级别会比Repeatable Read(可重读)大大提高并发量。在会话A中,更改A表的数据,不会影响会话B更改A表的数据,只要他们更改的数据不是同一个就可以并发执行。所以可以提高并发量。
    • Repeatable Read(可重读)在这个事务级别下,不存在赃读和不可重复读的问题,幻读的情况也很难发生,mysql做了优化,至少我在测试的时候一直没出现过,所以我觉得幻读是可能发生,概率很小。会话A更改A表的数据,会话B想更改A表的数据就要等待会话A事务提交以后才能执行,不管他们是不是更改的同一个数据,所以会有一个事务互斥的问题,会影响并发量,所以并发量大的情况下,事务级别应该设置为Read Committed(读取提交内容,读取已提交)(在版本5.6的情况下,5.7已经更新了方案,不会产生表锁了,所以结果可能不一样)
    • Serializable(可串行化) 在这个级别下,不存在赃读,不可重复读,幻读的问题,但是效率非常低,并发量很小。如果会话A在事务中更改了A表的数据,那么其他所有会话中的事务如果要查询或者更改A表的数据都需要等待会话A提交事务。
  • 相关阅读:
    Android笔记(六十六) android中的动画——XML文件定义属性动画
    Android笔记(六十五) android中的动画——属性动画(propertyanimation)
    python函数参数默认值及重要警告
    Python 列表
    Python数学运算入门把Python当作计算器
    Python 的非正式介绍
    python中为什么 if/while/def/class语句需要冒号?
    为什么Python在列表和元组的末尾允许使用逗号?
    现实世界中的 Python
    Python常见问题
  • 原文地址:https://www.cnblogs.com/liuyu7177/p/10643241.html
Copyright © 2011-2022 走看看