Mysql隔离级别

Mysql提供了4中隔离级别,在介绍这4中隔离级别前,先针对涉及的术语进行说明:

 1》、脏读:一个事务读取另外一个事务还没有提交的数据叫脏读【针对未提交的数据

 2》、不可重复读:即在同一个事务内,两个相同的查询返回了不同的结果【读取数据本身的对比

案例:设置事务的隔离级别读提交:set sessiontransactionisolationlevelreadcommitted;   查看事务隔离级别:select @@tx_isolation;

    设置自动提交:SET AUTOCOMMIT=0;

表tms_message_info数据:

    ID    file_name

              1     1111.SND

               2    2222.SND

事务A READ-COMMITTED事务B READ-COMMITTED

start transaction;

select * from tms_message_info where id='1'

start transaction;-- 开启事务

update tms_message_info set FILE_NAME='666.SND' where ID='1'; 未提交

B事务未提交前,A事务执行上述查询,得到的文件名结果为1111.SNDcommit;  B 事务提交

B事务提交后,A事务在执行查询,结果发生变化,文件名变为666.SND,即同一事务查询结果不同,即不可重复读 

 3》、幻读:即解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性),因此同一个事务同样的SELECT操作读到的结果会是一致的,但是,如果另一个事务同时提交了新数据或删除数据,本事务再更新时,就会“惊奇的”发现了这些新增或缺少数据,貌似之前读到的数据是“鬼影”一样的幻觉【同一事务A多次查询,若另一事务B只是update,则A事务多次查询结果相同;若B事务insert/delete数据,则A事务多次查询就会发现新增或缺少数据,出现幻读,即幻读关注读取结果集条数变化


1、读不提交(Read Uncommited,RU)

  这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用。

2、读提交(Read commited,RC)

  本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)

3、可重复读(Repeatable Read,RR)【MySQL 默认的级别】

  在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同一个事务同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象

4、 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥


隔离级别越高,并发性越差

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,130评论 2 89
  • 前一个文章讲述了事务ACID的特性以及并发事务造成的数据不一致性问题,事务ACID以及不一致性问题,接下来讲解下M...
    丁木木木木木阅读 3,535评论 0 4
  • Mysql概述 数据库是一个易于访问和修改的信息集合。它允许使用事务来确保数据的安全性和一致性,并能快速处理百万条...
    彦帧阅读 14,661评论 10 460
  • 隔离性其实是比较复杂的一种特性,在标准的SQL中定义四种隔离级别,每一种隔离级别都规定了一个事务中所做的修改,哪些...
    KillerManA阅读 2,481评论 0 1
  • 一、事务 1、事务四要素:ACID 对于事务,我之前的理解是很粗糙的,不就是为了保证操作的原子性么?一般订单系统或...
    张伟科阅读 5,169评论 0 5