【Mysql】InnoDB默认事务级别Repeatable Read & 可重复读 & 幻读

一、事务的特性ACID

    A原子性:事务包含的操作要么全部成功,要么全部失败回滚
    C一致性:事务必须使数据库从一个一致的状态变到另外一个一致的状态(满足完整性约束)
    I隔离性:多个事务之间不互相干扰
    D持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的

二、事务之间的隔离

    2.1、若无隔离

    脏读:一个事务处理过程中读取了另一个事务中未提交的数据
    不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了修改并提交,导致事务A多次读取同一数据时,结果不一致
    幻读:事务A处理全表的数据时,事务B插入一条新的数据,新加入的数据未被处理,事务A就像发生了幻觉一样
    不可重复读和幻读,不可重复读针对的是数据项的修改,幻读针对的是数据库的新增or删除

    2.2、事务隔离级别

    读未提交 --> 脏读,不可重复读,幻读
    读已提交 --> 不可重复读,幻读
    可重复读 --> 幻读
    串行化 -->

三、Mysql的默认级别Repeatable Read

    3.1、可重复读定义

    事务A中,执行同一条查询语句,得到的结果是一致的。

start transaction;
select * from user;  //(1)
insert into user values(?, ?)  //(2)
select * from user;  //(3)
commit

    事务A前后总共执行了两次SELECT语句,这两次SELECT得到的结果是一致的(事务A自己执行的insert语句,是在(3)结果中的)

    3.2、破坏可重复读的情况

    事务A:

start transaction;
SELECT * FROM user;  //(1)
INSERT INTO user VALUES(u1);  //(2)
SELECT * FROM user;  //(3)
commit

    事务B:

start transaction;
INSERT INTO user VALUES(u2);  //(1)
commit

    事务A在执行完(1)后,事务B执行了(1)且完成提交,这种情况下事务A在执行(3)的时候,应得到的是u1,这个时候是符合可重复读的性质的;如果得到的是u1、u3,这个时候就不是可重复读的;

    3.3、Mysql的InnoDB如何实现可重复读?以及该级别下如何解决幻读的问题
    3.3.1、基于MVCC解决幻读:使用情况快照读
    SELECT * FROM user;

    每一个事务,都有一个系统分配的事务id,该id是自动递增的。
    Mysql给每一条记录,添加了隐藏的两列,创建时间戳,删除时间戳,记录了一条记录由哪一个事务创建ÿ

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值