目录
是否使用过select for update?会产生哪些操作?
-
什么是数据库事务?事务的特性是什么?
事务:
- 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;
- 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;
- 事务是一组不可再分割的操作集合(工作逻辑单元)
- 事务都有 ACID 特性
-
什么是ACID?
-
并发事务会有哪些问题?
以下几种问题:
-
什么是脏读
两个事务同时操作了一个资源 ,第一个客户端读取了别的客户端修改前或者后面的数据(根据隔离级别的优先级)
-
什么是丢失修改
覆盖操作,两个事务同时对一个对象操作时,可能有一个事务会把另一个事务的操作覆盖了
-
什么是不可重复读
指在一个事务内多次读取同一数据…*,在这个事务还没结束时,另外一个事务也访问了这个数据并**对这个数据进行了修改…,那么就可能造成第一个事务两次读取的数据不一致,这种情况就被称为!**不可重复读。
-
什么是幻读
-
Mysql是如何避免事物并发问题的?
内部基于锁实现,配置事务隔离级别,和分布式系统设计一样(CAP定理)
-
事物隔离级别有哪些?
INNODB默认可重复读REPEATABLE_READ,一旦出了问题(幻读)可以换成串行化来解决问题
-
缓存能提升事务隔离级别性能不?
要维护数据库内部数据一致性的同时还要要求缓存内数据一致性,缓存就要双写操作,redis和数据库都要保持一致,进一步恶化写入性能,对于redis增加了一份额外写入操作,所以肯定能提高读的性能,但写的就不一定了,除非再在redis中进行读写分离,不过架构就更复杂了
-
Mysql事物隔离是如何实现的?
串行化加锁表,读完后不可写,写完可读;
隔离的主要操作是加读写锁和MVCC ,是加的行锁,分为不可重复读和可重复读,但是也不能完全解决幻读;
-
什么是一致性非锁定读和锁定读?
锁定读使用到了读写锁
- 读写锁是最简单直接的的事务隔离实现方式
- ·每次读操作需要获取一个共享(读)锁,每次写操作需要获取一个写锁。
- 共享锁之间不会产生互斥,共享锁和写锁之间、以及写锁与写锁之间会产生互斥;
- 当产生锁竞争时,需要等待其中一个操作释放锁后,另一个操作才能获取到锁。
- 锁机制,解决的就是多个事务同时更新数据,此时必须要有一个加锁的机制。
- 行锁(记录锁):解决的就是多个事务同时更新一行数据。
- 间隙锁:解决的就是多个事务同时更新多行数据
一致性读写锁:
select ... lock in share mode
select ... for update
insert、update、delete(写也需要读)
非锁定锁:MVCC多版本控制
-
说一下MVCC内部细节
- Multi-Version ConcurrencyControl多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问
- InnoDB是一个多版本的存储引擎。它保存有关已更改行的旧版本的信息,以支持并发和回滚等事务特性。这些信息存储在一个称为回滚段的数据结构中的系统表空间或undo表空间中。参见第14.6.3.4节“撤消表空间"。InnoDB使用回滚段中的信息来执行事务回滚所需的撤消操作。它还使用这些信息构建行的早期版本,以实现一致的读取
- MVCC 的实现依赖于:隐藏字段、Read View、undolog
三个隐藏字段:
- A6-byte DB_TRX_ID'用来标识最近一次对本行记录做修改 (insert、update) 的事务的标识符 ,即最后一次修改本行记录的事务id。如果是 delete 操作,在 |nnoDB 存储引擎内部也属于一次 update 操作,即更新行中的一个特殊位 ,将行标识为己删除,并非真正删除。
- A7-byte DB_ROLL_PTR 回滚指针,指向该行的 undolog。如果该行未被更新,则为空。
- A6-byte DB_ROW_ID 如果没有设置主键且该表没有唯一非空索引时,InnoDg 会使用该 id 来生成聚簇索引.
Read View
不同的事务隔离级别中,当有事物在执行过程中修改了数据(更新版本号),在并发事务时需要判断一下版本链中的哪个版本是当前事务可见的。为此InnoDB有了ReadView的概念,使用ReadView来记录和隔离不同事务并发时此记录的哪些版本是对当前访问事物可见的。
undo log
除了用来回滚数据,还可以读取可见版本的数据。以此实现非锁定读
-
Mysql事物一致性,原子性是如何实现的?
首先 通过锁和MVCC实现一致性和原子性,其次通过RedoLog记录对数据库的修改过程用来重启还原
-
Mysql事物的持久性是如何实现的?
使用Redolog保证了事务的持久性。当事务提交时,必须先将事务的所有日志写入日志文件进行持久化,就是我们常说的WAL(writeahead log)机制,如果出现断电重启便可以从redolog中恢复,如果redolog写入失败那么也就意味着修改失败整个事务也就直接回滚了
-
表级锁和行级锁有什么区别?
串行化锁表,会导致并发下降,一般ddl处理时使用
行级锁并发能力强
-
什么是行级锁?Mysq!如何完成的?
mvcc实现的,比较复杂,并不是单纯锁一行数据,还可以读历史数据
-
什么是共享锁(读锁)?
S锁,可以共享资源,主要用来读
-
什么是排它锁(写锁/独占锁)?
排他锁(X锁),主要用来写
-
什么是意向锁?
- 它分为意向共享锁(IS)和意向排他锁(IX)
- 一个事务对一张表的某行添加共享锁前,必须获得对该表一个!S锁或者优先级更高的锁。
- 一个事务对一张表的某行添加排他锁之前,它必须对该表获取一个!锁。
- 意向锁属于表锁,它不与innodb中的行锁冲突,任意两个意向锁之间也不会产生冲突,但是会与表锁(S锁和X锁)产生冲突
-
InnoDB支持哪几种锁?
- 表锁,行锁,间隙锁,Next-Key锁等
- 在Serializable中读加共享锁,写加排他锁。读写互斥
- 两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)
-
当前读和快照读是什么?
- 当前读:在锁定读(使用锁隔离事物)的时候读到的是最新版本的数据
- 快照读:可重复读(repeatable-read)下 mvcc生效读取的是数据的快照,并不是最新版本的数据(未提交事物的数据)
-
分布式事务知识点
-
什么是XA协议?
TM:事务管理器 AP:应用程序 RM:资源管理器
-
什么是mysql xa事务?
- 分为本地和外部xa事务,
- InnoDB内部本地普通事务操作协调数据写入与l0g写入两阶段提交
- 一般不用xa事务,因为是两阶段,服务器宕机后TM与RM容易一起失效,无法回滚;而且跨服务器操作事务一般不在数据库层开启,一般在应用层开启,因为应用层回滚时还能回滚接口,但是数据库回滚只能回滚数据;
-
xa事务与普通事务区别是什么?
xa是跨库,可以跨服务器,同时支撑INNODB内部日志两阶段记录
-
什么是2pc 3pc?
两阶段提提交事务,三阶段就是把TM和RM放在两个服务器运行,不只是在数据库内部操作,容错性更好,更灵活
-
是否使用过select for update?会产生哪些操作?
是一种查询时的排他锁,在查询时把每一行数据锁起来,确保数据不会被其他事务修改;
仅适用于innodb,且在(BEGIN或COMMIT)中才生效,分为表锁和行锁
-
说一下mysql死锁的原因和处理方法