事务存在的意义:保证系统中的数据,都是符合预期的;相互关联的数据之间,不会产生矛盾
达成事务的条件
原子性:一个操作,要么同时成功、要么同时失败
隔离性:各业务,读写相互独立
持久性:所有成功提交的数据修改,能够被正确的持久化
一致性:数据应该遵循某种约束条件
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 章