达成事务条件的实现原理

news/2024/10/30 11:20:27/

事务存在的意义:保证系统中的数据,都是符合预期的;相互关联的数据之间,不会产生矛盾

达成事务的条件

原子性:一个操作,要么同时成功、要么同时失败
隔离性:各业务,读写相互独立
持久性:所有成功提交的数据修改,能够被正确的持久化

一致性:数据应该遵循某种约束条件
ACID 中,AID 是手段(因),C 是目的(果)

aid:帮助,援助 ;记忆方式:通过 帮助,达到一致性(数据符合某种约束)

原子性和持久性的实现

在这里插入图片描述

脏数据:系统运行中,被修改或写入的内存页,但还没有被同步到磁盘上对应的数据页
Checkpoint:一种操作,用于将脏数据,刷新到磁盘
End record(结束记录):用于记录事务执行过程中,最后一个已提交的操作位置和状态信息

事务隔离级别

  • 读未提交:事务未提交,变更可被其他事务看到
  • 都已提交:事务提交,变更才可被其他事务看到
  • 可重复读:事务内,所看的数据,和事务启动时,是一致的
  • 串行化:加锁

MVCC

MVCC(Multi-Version Concurrency Control):多版本并发控制
用于解决并发读写问题,保证事务的隔离性数据的一致性

在使用MVCC机制时,每个事务都会看到一个特定的数据版本,这个版本是在事务开始时确定的。
每个写操作都会创建一个新的数据版本,并且所有事务都可以同时访问不同的数据版本,从而避免了锁的竞争,提高了并发性能。

当一个事务需要读取数据时,它只能看到早于该事务开始时间或者已经提交的数据版本。
如果另一个事务正在修改相同的数据,那么当前事务就会阻塞等待,直到锁被释放或者超时。

在MySQL中,实现MVCC机制主要依赖于 Read View

Read View:每次读取数据时,MySQL会创建一个Read View,其中包含了当前事务开始时间点之前已提交的所有事务的ID列表
Read View可以确保当前事务只能看到这些已提交的事务所产生的数据版本


读已提交:所看到的版本,为事务提交之后的版本
可重复读:所看到的版本,为开启事务的版本,只要不提交,之后就一直复用刚开启事务的时候的版本

表初始化

CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT NOT NULL,sex TINYINT(4) DEFAULT 0,phone VARCHAR(20),address VARCHAR(100),PRIMARY KEY (id)
);INSERT INTO my_table 
( id, name, age, sex, phone, address )
VALUES ( 1, 'zhangsan', 18, 0, '131', '上海市' );

事务1

-- 事务1
-- 开启事务
BEGIN;UPDATE my_table SET age = 19 WHERE id = 1;
UPDATE my_table SET age = 20 WHERE id = 1;COMMIT;

用于 select 的新事务

-- 用于 select 的新事务
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 查看隔离级别
SELECT @@tx_isolation;-- 开启事务
BEGIN;SELECT * FROM my_table WHERE id = 1;

读已提交

在这里插入图片描述

可重复读

在这里插入图片描述

原理解释

在这里插入图片描述

参考:
《凤凰架构》第 3 章 事务处理
《从根儿理解 MySQL》第 21 章


http://www.ppmy.cn/news/62604.html

相关文章

Qt Quick Image探秘:从底层原理到高级应用

目录标题 一、Qt Quick Image类简介 (Introduction to Qt Quick Image)1.1 Qt Quick概述 (Overview of Qt Quick)QML简介Qt Quick的优势 1.2 Image类的作用与特点 (Purpose and Features of Image)主要功能特点与优势 1.3 开发环境搭建 (Setting up the Development Environmen…

ChatGPT背后的打工人:你不干,有的是AI干

AI“出圈” 如今,数字技术发展速度惊人,AI提高了社会生产效率,更真切地冲击到原有的生产秩序。 年初AI技术的爆发,让国内看到了进一步降本增效的希望。 国内多家互联网企业相继推出类ChatGPT产品,复旦大学邱锡鹏教授…

今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

requestAnimationFrame 和 requestIdleCallback API

requestAnimationFrame window.requestAnimationFrame() 方法告诉浏览器您希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。 ⚠️ 注意:若您想要在下一次重绘…

C++ 类的继承与派生

目录 1、继承的概念 2、继承(Inherit) 3、继承方式 4、父子同名成员并存 5、虚函数(virtual) 6、纯虚函数 1、继承的概念 以李白为例 类1是类2的基类(父类),类2是类3的基类(父类…

港科夜闻|广东省委常委、副省长王曦到访香港科技大学

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、广东省委常委、副省长王曦到访香港科技大学。在香港科大校长、粤港澳大湾区院士联盟理事会主席叶玉如教授陪同下,王曦常委率代表团参观国家级科研设施和了解学校发展情况,并与在港中国科学院院士座…

使用 Mercury 直接从 Jupyter 构建 Web 程序

动动发财的小手,点个赞吧! 有效的沟通在所有数据驱动的项目中都至关重要。数据专业人员通常需要将他们的发现和见解传达给利益相关者,包括业务领导、技术团队和其他数据科学家。 虽然传达数据见解的传统方法(如 PowerPoint 演示文…

【Linux】Keepalived+Haproxy实现数据库集群负载均衡

1、简介: 本文章的负载均衡和高可用是体现在两个从服务器上的。一般来说高可用是用在主服务器中的,例如双主多从的结构,双主做keepalived的高可用(当然也可以加上haproxy做负载均衡),多从做haproxy的负载均…