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提交事务。
原文地址:https://www.cnblogs.com/liuyu7177/p/10643241.html