1.什么是事务?

是一个逻辑工作单元,这个工作单元中的所有操作,要么都成功,要么都失败

2.事务是如何保证数据的正确性的?

通过事务的四大特性:原子性、一致性、隔离性、持久性

原子性(Atomicity):通过undolog回滚日志实现其原子性

一致性(Consistent):引擎层面使用的是undolog回滚日志以及让mysql具备故障恢复能力的redolog重做日志,服务层面使用的是binlog归档日志

隔离性(Isolation):首先是事务并发带来的问题:脏读、不可重复读、幻读

         事务的隔离级别:读未提交(read-uncommitted)、读已提交(RC)、可重复读(RR)、可串行化(serializable)

         查看数据库的隔离级别:select @@tx_isolation (mysql数据库的默认级别是repeatable-read)设置就是set tx_isolation=‘serializable’

         事务隔离底层实现:锁的设计、MVCC

持久性(Darble):通过redolog重做日志实现

      原子性(通过undolog实现-执行回滚)

      隔离性(通过锁,MVCC-多版本并发控制)

      一致性(通过undolog,redolog,binlog)

      持久性(通过redolog日志实现)

3.多个事务并发执行时,可能会带来什么问题?

1)脏读:一个事务读取了其他事务未提交的数据,然后这个数据后面又回滚了

2)不可重复读:一个事务对同样的查询条件进行多次查询时,得到的结果不一致

3)幻读:一个读取到的数据可能是表中不存在的数据

注意:事务的隔离级别越高,并发性可能会越差

4.mysql中的锁是如何分类的?

从性能上可以分为乐观锁和悲观锁

从操作类型上可以分为读锁(共享锁)和写锁(排他锁)

从数据操作粒度上来讲可以分为全局锁、表锁、行锁、间隙锁(between 100 and 200)

5.如何理解MySQL中的全局锁?

全局锁是要关闭所有打开的表。在mysql可以使用全局锁锁定所有表,通常应用于逻辑备份,我们在执行数据库备份时,不允许其他事务对数据库进行更新了,因为这样可能会导致备份的数据与库中实际的数据不一致。

6.MySQL中的全局锁是如何应用的?

加全局读锁(flush table with read lock):只能读库中所有表的数据,但是不能写(insert、delete、update)

解锁(unlock tables)

7.如何对MySQL中的表添加读锁(共享锁)、写锁(排它锁)?

读锁(lock table regions read):所有线程可以读,当前线程写会出错,其它线程写会阻塞。

写锁(lock table regions write):当前线程可以读写,其它线程读写要阻塞。

解锁(unlock tables)

8.如何对MySQL表中的行添加行锁(InnoDB默认select操作不加锁)?

共享锁 (select * from regions where id=13 lock in share mode),又称为S锁,允许当前事务读取一行,阻止其它事务获取相同数据集的排它锁。

排它锁 (select * from regions where id=13 for update),又称为X锁。允许当前事务更新数据,阻止其它事务获取相同数据集的共享锁和排它锁。

9.MVCC是什么?

MVCC(Multi Version Concurrent Control)多版本并发控制,可通过这种方式在保证其性能的基础上实现事务的隔离级别。例如MySQL中的RC、RR事务的隔离级别底层就是通过MVCC实现的。

10.MVCC的底层逻辑是如何实现的呢?

MVCC的实现原理主要依赖于记录中的undolog(回滚日志)、ReadView(快照读)、三个隐藏字段 来实现的

三个隐藏字段:

      DB_TRX_ID:记录创建这条记录或者最后一次修改该记录的事务id

      DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undolog实现数据的回滚.

      DB_ROW_ID:隐藏的主键,如果数据表没有主键,也没有非空且唯一的字段,那么innodb会自动生成一个row_id。

11.如何理解MVCC中的版本链?

当我们开启了一个事务,并且这个是要对数据进行更新,此时会产生一条undolog日志,多个事务同时操作这一条记录时,那就会产生多个版本的undolog日志,这些日志就会通过回滚指针(DB_ROLL_PTR)构建一个链表,这个链表就称之为版本链。

12.什么是ReadView?以及应用场景?

ReadView提供了某一时刻事务系统的一个快照读,主要是用来做“可见性”判断。这个ReadView中也保存了对本事务不可见的一些其他活跃事务的id。

对于Read Committed和Repeatable Read的隔离级别,都要读取已经提交的事务数据,也就是说如果版本链中的事务没有提交,该版本的记录是不能被读取的,那哪个版本的事务是可以读取的,此时就引入了ReadView。MySQL数据库的隔离级别中的Read Committed和Repeatable Read底层都是通过这个MVCC实现的。

13.ReadView中包含什么?

MySQL5.7版本中的ReadView包含以下几个属性:

1)m_ids:截止到当前事务id之前,所有活跃的事务id(还没有commit的事务)。例如m_ids【1,2,3,4】

2)mix_trx_id:记录活跃事务id中(m_ids)的最小值。例如1

3)max_trx_id:保存当前事务结束后应分配的下一个事务的id值。例如5

4)creator_trx_id:保存创建ReadView的当前事务的id。例如4

ReadView会根据图中的四个属性,再结合undo日志版本链,实现MVCC机制,决定一个事务可以读取到的数据版本。

14.ReadView的可见性判断规则是怎样的?

一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这几种情况:

1. 如果记录的 trx_id 值小于 Read View 中的 min_trx_id 值,表示这个版本的记录是在创建 Read View 前已经提交的事务生成的,所以该版本的记录对当前事务可见。

2. 如果记录的 trx_id 值大于等于 Read View 中的 max_trx_id 值,表示这个版本的记录是在创建 Read View 后才启动的事务生成的,所以该版本的记录对当前事务不可见。

3. 如果记录的 trx_id 值在 Read View 的 min_trx_id 和 max_trx_id 之间,需要判断 trx_id 是否在 m_ids 列表中:

   如果记录的 trx_id 在m_ids 列表中,表示生成该版本记录的活跃事务依然活跃着(还没提交事务),所以该版本的记录对当前事务不可见。

  如果记录的 trx_id 不在 m_ids 列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见。

15.事务的隔离级别(Read Committed 和Repeatable Read)何时创建的ReadView视图?

1)Read Committed隔离级别是每次select都会创建一个新的ReadView(可以读取已经提交的数据)

2)Repeatable Read隔离级别是第一次select时创建一个ReadView(每次只能读取当前事务的数据)

16.可重复读底层逻辑是如何实现的?

详情:(https://www.processon.com/view/link/63a1a5cb517570317d7bb536)

最新文章

  1. 解决vsftpd的refusing to run with writable root inside chroot错误
  2. SharePoint Site "Regional Settings"功能与CSOM的对应
  3. 改变Yii2的默认路由
  4. Softnet_data
  5. web appbuilder 改变样式和添加自定义widget
  6. Html的第一次小结
  7. JS动态引入js、CSS动态创建script/link/style标签
  8. mysql中的prepare介绍和应用
  9. Berlekamp-Massey算法学习笔记
  10. java实现《剑指offer》(一)1~10
  11. Android:(本地、可通信的、前台、远程)Service使用全面介绍
  12. 2018.10.16 NOIP模拟 长者(主席树+hash)
  13. java的@PostConstruct注解
  14. Harbor 学习分享系列2 - Harbor项目介绍
  15. Ubuntu16.04安装视觉SLAM环境(DBow3)
  16. vs2015新建web应用程序空模板和添加webapi的模板生成文件的比较
  17. oracle中空值null的判断和转换:NVL的用法
  18. Linux文件权限分析
  19. Java学习之路(一):日常第一课,认识JAVA
  20. python 基础练习题, 陆续添加中

热门文章

  1. 从零实现在线云相亲APP|程序员脱单神器(内附源码Demo)
  2. python 操作 WhiteSpace 语言
  3. SnakeYaml的不出网反序列化利用分析
  4. 血药谷浓度能否区分经TNF拮抗剂诱导获得缓解和低活动度的RA患者
  5. CPU持续100%分析并解决
  6. 这里记录一下我个人对AXI4主从模块的理解(这些理解主要来自阅读 Xilinx AXI_FULL_M_module 源码)
  7. 文字icon
  8. 8. fitBounds(用了这个你就不用在设置zoom, minZoom, maxZoom, center)
  9. ChatGPT回答的关于maxscript + python
  10. winform 更新下载压缩文件解压并覆盖