• 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
    梦想责任与团队
    在MySQL字段中使用逗号分隔符
    session_write_close() 用法
    课程-问题分析与解决
    团队管理:新业务团队如何结合绩效来度量开发目标
    Linux sort 排序 去重 统计
    nginx-404与fastcgi_intercept_errors指令
    nginx fastcgi_buffers to an upstream response is buffered to a temporary file
    10年软件开发中获得的最宝贵的经验!非常值得你一读
  • 原文地址:https://www.cnblogs.com/liuyu7177/p/10643241.html
Copyright © 2020-2023  润新知