理解mysql的事务 ACID 隔离级别 并发事务的问题

事务

事务是多个或者一组操作的集合,它把多个操作合并起来 看作一个不可分割的工作单位,然后把这一个整体 一起向事务提交。 要么一起成功 要么一起失败

这些操作 要么同时成功 要么同时失败

mysql中自动会将每一条dml语句单独提交为事务

四大特性

ACID 这四个性质,比较常见 面试也经常问,我个人的建议是如果你能不看答案的情况下把它按自己的理解 写出来, 那你基本就掌握了。

比如我们现在 现场来写:

  • 原子性 这个就是开篇讲的 事务 要么一起成功 要么一起失败
  • 一致性 事务是操作数据的 事务执行完之后 不管成功还是失败前后的数据一定是不变的。 新手可能会疑惑 这跟原子性不是一个意思吗??
    这里要理解和原子性的区别
    原子性只保证你多个操作一起成功和一起失败 他是它不保证 成功和失败后数据还是原来的模样,因为一起失败可能就把数据改乱了
  • 隔离性 这个是针对 并发环境中的情况说的 比如有两个事务同时操作某一块数据的时候 能保证他们相互不干扰 并发事务的问题还是挺复杂的 后面单独讲
  • 持久性 这个是最好理解的 就是说事务执行成功后数据都要持久化到mysql的底层文件中去 保证是持久性的。
    (这个地方牵扯到 存储引擎比如innoDB是怎么存储mysql数据的 它的底层结构是表命名空间-段-区-页-行。)

并发事务问题

我们把上面四个里面的隔离性 单独拿出来说
就是并发事务问题:

常见的三种 幻读 不可重复读 脏读

这三种 新手一定要彻底理解它们的意义 然后自己画出来 不要去死记硬背

比如第一张

幻读:

左边这个事务去数据库里面查id=1 没有这个数据

然后这是右边的事务去插入一条数据

这时候左边的事务再插入的时候发现已经有了 插入冲突
请添加图片描述

不可重复读:

这个翻译翻的很垃圾 很容易误导新手
正确的翻译应该是

重复读取不一致
左边的事务因为特别的原因需要读取2次
但是读取两次的中间
右边的事务插入进来一条数据
导致2次读取不一致。
请添加图片描述

脏读:

右边的事务修改数据 1->2
左边的事务读取读取到2
但是右边的事务 异常了 需要回滚所有操作
这时候又变回了1
左边的事务读取了一个脏数据
在这里插入图片描述

隔离级别

隔离级别有四种,mysql默认级别是

可重复读级别

它可以防止脏读与不可重复读

因为通过总结我们发现 脏读与不可重复读
都是读数据部不一致导致的

可重复读级别 下
读取数据和修改数据的行为
都是第一次读取(修改数据也得先第一次读取 再修改)的时候 建立一个快照
在事务的周期中 读取的都是这个快照 而不是实际的数据

一直到事务确定提交成功之后

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值