达成事务条件的实现原理

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

达成事务的条件

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

一致性:数据应该遵循某种约束条件
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 章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值