数据库SQL面经--第二弹

发布时间:2024年01月12日

事物的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):也叫独占锁,写锁,允许事务删除或更新数据

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

文章来源:https://blog.csdn.net/qq_57106289/article/details/135522655
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。