数据库SQL面经--第二弹

事物的ACID(基本要素)

  1. 原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部回滚到操作前的状态,不会停留在中间状态。
  2. 一致性(Consistency):事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。在事务执行过程中,数据库的完整性约束不被破坏。
  3. 隔离性(Isolation):并发执行的多个事务之间相互隔离,每个事务在逻辑上都感觉不到其他事务的存在。事务的执行是相互独立的,不会相互干扰。
  4. 持久性(Durability):一旦事务提交,其对数据库的修改就是永久性的,即使在系统故障或重启时也能保持。

并行事物带来的问题

数据一致性问题:

  • 脏读(dirty read):一个事务读到另一个事务未提交的数据就叫做脏读。一个事务对一条记录做修改,在这个事务提交前是有可能随时回滚的,这些数据就是脏数据。
  • 不可重复读(non-repeatable read):在一个事务内多次读取同一条记录,前后结果不一样就叫做不可重复读。事务 A 多次查询同一行数据,在多次查询中间,事务 B 对该行数据进行了修改,事务 A 多次查询同一行的数据就会不一致。
  • 幻读(phantom read):在一个事务内按相同条件多次查询,前后结果集的数量不同就叫做幻读。事务 A 按 id>5 的条件进行多次查询,在多次查询中间,事务 B 插入了一条 id 为6的数据,事务 A 多次查询的结果集数量就会不同。

影响:

  • 脏读:读到其他事务未提交的数据
  • 不可重复读:前后读取数据不一致
  • 幻读:前后读取的结果集数量不同

MYSQL的隔离级别

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

MYSQL默认的隔离级别

MySQL 默认的隔离级别是可重复读(REPEATABLE READ)

不用序列化怎么解决幻读

  • 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
  • 针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

什么是MVCC

多版本并发控制,数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。

  • 事务版本号:事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。
  • 隐式字段:对于InnoDB存储引擎,每一行记录都有两个隐藏列trx_id、roll_pointer,如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列row_id。

InnoDB中的锁

共享锁和排他锁

  • 共享锁(S Lock):读锁,允许事务读取数据
  • 排他锁(X Lock):也叫独占锁,写锁,允许事务删除或更新数据

如果事务获取了某个数据的共享锁,其他事务可以立即获得该数据的共享锁,这种情况叫锁兼容。如果事务获取了某个数据的共享锁或排他锁,其他事务想要获取该数据的排他锁,必须要等到该行的锁释放掉

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值