事务的基本要素(ACID),事务的并发问题,MySQL的四种事务隔离级别

一、事务的基本要素(ACID)

  1. 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,出错会全部回滚
  2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏
  3. 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
  4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚

小结:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。

二、事务的并发问题

  1. 赃读:事务A更新了数据,事务B读了更新后的数据,事务A出错后滚,此时事务B就读取了脏数据
  2. 不可重复读:事务A多次读取同一数据,事务B作了更新并提交,导致事务A读取同一数据时,结果不一样
  3. 幻读:事务A更新一个表中满足条件的数据行后,事务B在更新后对表插入一条满足条件的新数据,结果事务A发现表中还存在没有修改的数据行,就好像发生了幻觉一样

不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

三、MySQL事务隔离级别

事务隔离级别赃读不可重复读幻读
未提交读(read-uncommitted)
已提交读(read-committed)
可重复读(repeatable-read)
可串行化(serializable)
  1. 未提交读(read-uncommitted):在未提交读级别,事务中的修改,即使没有提交,对其他事务也都是可见的,三种问题都会出现

  2. 已提交读(read-committed):大多数数据库系统的默认隔离级别都是提交读(但Mysql不是)。提交读满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。

  3. 可重复读(repeatable-read):可重复读解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。是MySQL的默认事务隔离级别。

  4. 可串行化(Serializable):它通过强制事务串行执行,避免了前面所说的幻读问题。可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值