0
点赞
收藏
分享

微信扫一扫

数据库知识点整理(一)

生命中最美的是成长 2022-04-01 阅读 110
c++面试

(一)事务

1、请你说一下数据库事务以及四个特性

  • 数据库事务:并发控制的基本单位,是一个操作序列,这些操作要么全部执行,要么全部不执行。
  • 为什么要有事务呢? 就是为了保证数据的最终一致性。(通俗来说就是一组SQL语句,而且这组SQL要么同时都执行成功要么同时都不成功。)
  • 四个典型特性,即ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

(1) 原子性

  • 事务作为一个整体被执行,包含在其中的数据库的操作要么全部都执行,要么都不执行

(2)一致性

  • 事务开始前和后,数据不会被破坏

(3) 隔离性

  • 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰

(4) 持久性

  • 事务完成提交后,该事务对数据库的操作更改,将持久地保存在数据库之中

2、事务并发存在的问题

(1) 脏读:如果一个事务读取到了另一个未提交事务修改过的数据,我们就称发生了脏读现象。

(2) 不可重复读:同一个事务内,前后多次读取,读取到的数据内容不一致

(3) 幻读:如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些搜索条件的记录(如insert、delete、update)

3、 并发数据库中丢失修改问题的解决办法

  • 采用一个时间戳字段记录哪个事务先修改的记录。时间戳不是一个时间,而类似于一个自动增长字段,但它有一个特点,就是每次更新某条记录时,会自动更新为一个新的时间戳数据。在SQL Server中,设置为一个字段为timestamp数据类型,读取时可以使用varbinary类型读取。
  • 主要思路是:读取剩余票数时就同时读取该记录的时间戳,当更新记录时,判断时间戳是否与原来读取的相同,如果不同,说明已经有一个事务修改了这条记录,就让当前事务失败。

4、请你说一说数据库事务隔离(为了解决事务并发存在的问题)

(1) 读未提交

  • 只限制了两个数据不能同时修改,但是修改数据的时候,即使事务未提交,都是可以被别的事务读取到的,这级别的事务隔离有脏读、重复读、幻读的问题;

(2) 读已提交

  • 当前事务只能读取到其他事务提交的数据,所以这种事务的隔离级别解决了脏读问题,但还是会存在重复读、幻读问题;

(3) 可重复读

  • 限制了读取数据的时候,不可以进行修改,所以解决了重复读的问题,但是读取范围数据的时候,是可以插入数据,所以还会存在幻读问题;

(4) 串行化

  • 所有事务都是进行串行化顺序执行的。可以避免脏读、不可重复读与幻读所有并发问题。但是这种事务隔离级别下,事务执行很耗性能。

在这里插入图片描述

(二)MVCC(Multi-Version Concurrency Control)多版本并发控制

1、定义

  • MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。实现读取数据不用加锁,可以让读取数据同时修改。修改数据时同时可读取。
  • 通俗的讲,数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。
  • 数据库隔离级别读已提交、可重复读 都是基于MVCC实现的,相对于加锁简单粗暴的方式,它用更好的方式去处理读写冲突,能有效提高数据库并发性能。
  • 所谓的MVCC指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

2、 关键知识点

(1) 事务版本号

  • 事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。这就是事务版本号。

(2) 隐式字段

  • 对于InnoDB存储引擎,每一行记录都有两个隐藏列trx_id(当前事务版本号)、roll_pointer(回滚指针),如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列row_id。

(3) 回滚日志( undo log)

  • 用于记录数据被修改前的信息。在表记录修改之前,会先把数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据。
  • 用途:事务回滚时,保证原子性和一致性。用于MVCC快照读

(5) 版本链

  • 多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。在这里插入图片描述

(6) 快照读和当前读

  • 快照读: 读取的是记录数据的可见版本(有旧的版本)。不加锁,普通的select语句都是快照读。
    • MVCCC是“维持一个数据的多个版本,使读写操作没有冲突”的一个抽象概念。这个概念需要具体功能去实现,这个具体实现就是快照读。
`select * from core_user where id > 2;`
  • 当前读:读取的是记录数据的最新版本,显式加锁的都是当前读
select * from core_user where id > 2 for update;select * from account where id>2 lock in share mode;

(7) Read View

  • 定义:事务执行SQL语句时,产生的视图。实际上在innodb中,每个SQL语句执行前都会得到一个Read View。
  • 作用:用来做可见性判断的,即判断当前事务可见哪个版本的数据

3、原理分析

  • 通过版本链、undo日志、Read View来实现

4、解决了哪些问题

  • 并发读-写时:可以做到读操作不阻塞写操作,同时写操作也不会阻塞读操作。
  • 解决脏读、幻读、不可重复读等事务隔离问题,但不能解决上面的写-写 更新丢失问题
    • MVCC + 锁:MVCC解决读写冲突,悲观锁解决写写冲突
举报

相关推荐

0 条评论