【数据库】事务、锁和索引

事务

事务:为了达到某个目的(比如:银行转账)而做的一系列操作。

1、事务的特性(ACID)

  • 原子性:一个事务中的所有操作,要么全部执行成功,要么全部失败

  • 一致性:一个事务执行前后,数据库的状态保持一致

  • 隔离性:多个并发事务对数据库进行操作,各并发事务之间互不干扰

  • 持久性:一个事务在提交之后,对数据库的改变是持久的

2、事务的隔离级别

读未提交、读提交、可重复读、可串行化,并行性依次降低,安全性依次提高

  • 读未提交(Read Uncommitted)
    最低的隔离级别,一个事务可以读到另一个事务未提交的结果,所有的并发事务问题都会发生。

  • 读提交(Read committed)
    只有在事务提交后,其更新结果才会被其他事务看见可以解决脏读问题,但是不可重复读或幻读仍有可能发生。Oracle 默认采用的是该隔离级别。

  • 可重复读(Repeatable Read)
    开始读数据的时候(事务开启),不允许修改(update)操作
    在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交,除非数据是被本身事务自己所修改。可解决脏读、不可重复读。MySQL 默认采用可重复读隔离级别。

  • 可串行化(Serializable)
    它是在每个读的数据行上加上共享锁。
    事务串行化执行,隔离级别最高,完全服从 ACID,牺牲了系统的并发性,也就是说,所有事务依次逐个执行,所以可以解决并发事务的所有问题。

3、什么是脏读、幻读、不可重复读?(并发事务问题)

  • 脏读读了未被提交的事务,然后被回滚了

  • 不可重复读读取了提交的新事物,指的是更新update操作

  • 幻读读取了提交的新事物,指的是增删 insert、delete操作
    (当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行)

补充:不可重复读针对的是行数据被修改,避免方法是行锁;幻读针对的是增加或者删除行数据,避免方法是表锁。

4、什么是最左前缀匹配原则?

在 MySQL 建立 联合索引(多列索引) 时会遵守最左前缀匹配原则,即 最左优先,在检索数据时从联合索引的最左边开始匹配。例如,有一个 3 列索引(a,b,c),则已经对(a)、(a,b)、(a,b,c)上建立了索引。所以在创建联合索引时,要根据业务需求,where 子句中 使用最频繁 的一列放在最左边。

5、InnoDB 的 MVCC机制

  • MVCC(Multi-version Concurrency Control) 全称是多版本并发控制。MVCC机制的作用其实就是避免同一个数据在不同事务之间的竞争,提高系统的并发性能
  • 其逻辑是维持一个数据的多个版本,解决事物的读写冲突。做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
  • MVCC在读已提交和可重复读的事务隔离级别下工作。

InnoDB的默认级别是可重复读,MVCC可以解决脏读、幻读、不可重复读等事物隔离问题。

MVCC实现原理是依赖记录中的:隐藏列、undo日志和ReadView
1)隐藏列:每行数据都有隐藏列,隐藏列中包含了本行数据的事务id、指向undo log的指针。

2)undo版本链:每行数据的隐藏列中包含了指向undo log的指针,而每条指向undo log的指针也会指向更早版本的undo log,形成一个链。

3)Read View:通过隐藏列和版本链,MySQL可以将数据恢复到指定版本。但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys)打快照,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys快照比较,从而判断数据对该ReadView是否可见,即对事务A是否可见。

为什么要引入锁?
同一时刻多个用户同时操作数据库中的数据,这会导致数据库混乱,因此引入了锁。
1)能够保证数据完整性。
2)能够保证数据一致性

针对锁粒度划分,可分为行锁、表锁、库锁

1、表锁和库锁

  • 表锁:上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;
    特点: 粒度大,加锁简单容易冲突

  • 行锁:加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;
    特点:粒度小,加锁比表锁麻烦不容易冲突,相比表锁支持的并发要高;
    锁的粒度越大越容易发生冲突

二者的区别
表锁:开销小,加锁快,不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低。
行锁:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

2、乐观锁和悲观锁

3、独占锁、共享锁和更新锁

索引

索引

①主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索引的关键字绝对不允许有重复值。
②候选索引:和主索引类似,它的值也不允许在指定的字段或表达式中重复。一个表中可以有多个候选索引。
③唯一索引:唯一索引允许关键字取重复的值。当有重复值出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的版本。
④普通索引:普通索引允许关键字段有相同值。在一对多关系的多方,可以使用普通索引。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值