当前位置:网站首页>MySql数据库-事务-学习笔记
MySql数据库-事务-学习笔记
2022-07-07 06:28:00 【白蝶丶】
这里写目录标题
前言
作者最近在学习mysql事务,故想通过写博客的形式记录学习过程。如有错误,敬请指正
事务是什么
事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,
即这些操作要么同时成功,要么同时失败。
`
事务的性质
事务的性质有四个,分别是原子性、一致性、隔离性、持久性
原子性(A):事务是不可分割的最小操作单位,要么全部成功,要么全部失败
一致性(C):事务将数据库从一种状态转变为另一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性(I):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(D):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
- 脏读:一个事务读到另外一个事务还没有提交的数据。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。 - 幻读:一个事务按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。
事务隔离级别
为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:
事务原理
1.原子性实现原理(undo log)
实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。InnoDB实现回滚靠的是undo log,当事务对数据库进行修改时,InnoDB会生成对应的undo log。如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。
undo log属于逻辑日志,它记录的是sql执行相关的信息。当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作。对于insert,回滚时会执行delete。对于delete,回滚时会执行insert。对于update,回滚时则会执行相反的update,把数据改回去。
2.持久性实现原理(redo log)
redo log,重做日志。记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。
InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲。当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool。当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。
Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。
于是,redo log被引入来解决这个问题。当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作。当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。
既然redo log也需要在事务提交时将日志写入磁盘,为什么它比直接将Buffer Pool中修改的数据写入磁盘(即刷脏)要快呢?主要有以下两方面的原因:
- 刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO。
- 刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入。而redo log中只包含真正需要写入的部分,无效IO大大减少。
3.隔离性原理(锁和MVCC)
隔离性追求的是并发情形下事务之间互不干扰。简单起见,我们主要考虑最简单的读操作和写操作(加锁读等特殊读操作会特殊说明),那么隔离性的探讨,主要可以分为两个方面。
第一方面,(一个事务)写操作对(另一个事务)写操作的影响:锁机制保证隔离性。具体可看:数据库锁
第二方面,(一个事务)写操作对(另一个事务)读操作的影响:MVCC保证隔离性。
MVCC全称Multi-Version Concurrency Control,即多版本的并发控制协议。它最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,多个版本的数据可以共存,主要基于以下技术及数据结构:
隐藏列:InnoDB中每行数据都有隐藏列,隐藏列中包含了本行数据的事务id、指向undo log的指针等。
基于undo log的版本链:每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,从而形成一条版本链。
ReadView:通过隐藏列和版本链,MySQL可以将数据恢复到指定版本。但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys)打快照,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys快照比较,从而判断数据对该ReadView是否可见,即对事务A是否可见。
隐藏列
版本链
readview
4.一致性原理
可以说,一致性是事务追求的最终目标。前面提到的原子性、持久性和隔离性,都是为了保证数据库状态的一致性。此外,除了数据库层面的保障,一致性的实现也需要应用层面进行保障。实现一致性的措施包括:
保证原子性、持久性和隔离性,如果这些特性无法保证,事务的一致性也无法保证。
数据库本身提供保障,例如不允许向整形列插入字符串值、字符串长度不能超过列的限制等。
应用层面进行保障,例如如果转账操作只扣除转账者的余额,而没有增加接收者的余额,无论数据库实现的多么完美,也无法保证状态的一致。
边栏推荐
- MySQL master-slave delay solution
- RuntimeError: Calculated padded input size per channel: (1 x 1). Kernel size: (5 x 5). Kernel size c
- PPT模板、素材下载网站(纯干货,建议收藏)
- GoLand set goproxy
- What is the value of getting a PMP certificate?
- C语言指针(上篇)
- H3C vxlan configuration
- 【ChaosBlade:节点 CPU 负载、节点网络延迟、节点网络丢包、节点域名访问异常】
- Vagrant failed to mount directory mount: unknown filesystem type 'vboxsf'
- Several methods of calculating the average value of two numbers
猜你喜欢
NVIC中断优先级管理
使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题
C语言指针(上篇)
Druid monitoring - Introduction to JMX usage and principle
PMP examination experience sharing
数据在内存中的存储
Full link voltage test of the e-commerce campaign Guide
STM32 clock system
[istio introduction, architecture, components]
Port multiplexing and re imaging
随机推荐
Simple use of Xray
Digital triangle model acwing 1027 Grid access
C语言指针(特别篇)
Isomorphic C language
硬核分享:硬件工程师常用工具包
Problems encountered in the use of go micro
C language pointer (Part 2)
为不同类型设备构建应用的三大更新 | 2022 I/O 重点回顾
9c09730c0eea36d495c3ff6efe3708d8
2022-07-06 unity core 9 - 3D animation
2020 year end summary
How long does the PMP usually need to prepare for the exam in advance?
What is the rating of Huishang futures company? Is it safe to open an account? I want to open an account, OK?
channel. Detailed explanation of queuedeclare parameters
Enterprise manager cannot connect to the database instance
如何统计项目代码行数
2022-06-30 unity core 8 - model import
Selenium automation integration, eight years of testing experience, soft test engineer, an article to teach you
Leetcode刷题记录(数组)组合总和、组合总和 II
PPT模板、素材下载网站(纯干货,建议收藏)