一. 事务特性
- 原子性:事务包含的所有操作要么都成功,要么都失败;
- 一致性:事务操作数据的变化,前后保持一致状态,比如5000块钱,转出去2000,就必须剩下3000;
- 隔离性:基于事务隔离级别,事务之间操作互不影响;
- 持久性:事务提交后,数据更新进数据库,不会因为任何原因丢失提交事务的操作;
二.名称解释
- 脏读:事务之间读取到未提交的数据;
- 不可重复读:查询同一条数据,多次读取时,该数据列值发生变化,在这此期间,其他事务可以更新该条数据;
- 幻读:查询同一范围内的多条数据,多次读取时,该范围内的数据行数发生了变化,其他事务可以新增删除数据;
注意:不可重复读和幻读的区别
三.数据库隔离级别
- Read Uncommitted (读未提交数据):一般不使用,可以读取到事务未提交的数据(脏读,不可重复度,幻读);
- Read Committed (读已提交数据):大多数数据库默认的隔离级别,读取事务提交后的数据(不可重复度,幻读);
- Repeatable Read (可重复读):mysql默认的隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行(幻读);可重复读隔离级详细分析
- Serializable (串行化):强制事务排序,使之不可能相互冲突(无);
四.MySQL InnoDB对隔离级别的支持


五.实现事务隔离的两大方案
第一种,读取数据的时候,锁定我们要操作的数据,不允许其他事务修改就行了。这种方案我们叫做基于锁的并发控制Lock Based Concurrency Control(LBCC)。
第二种,在修改数据的时候给它建立一个备份或者叫快照,后面再来读取这个快照就行了。这种方案我们叫做多版本的并发控制Multi Version Concurrency Control(MVCC)。
MVCC的核心思想是:可以查到在当前事务之前已经存在的已提交的数据,即使它在后面被其他事务修改或者删除了,和之前查到的数据还是一样,不会改变,在当前事务之后新增的数据,我是查不到的。可以看一下这个简化的模型来理解MVCC简化模型
MVCC的查找规则: 只能查找创建时间小于等于当前事务ID的数据,和删除时间大于当前事务ID的行(或未删除)。你在一个事务t1中进行了一次查询,在t1之后的事务中更新的数据和插入的数据,在t1中都查不到,如果在t1之后的事务中删除数据,那么在t1中再查的话,就没有删除的数据了(自行在mysql数据库测试时,使用默认事务隔离级别,依旧能查到被 删除时间大于当前事务ID的其他事务 删除的数据,然后更新操作无效,提交事务后查询,此时查询没有删除的数据)。
在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。
六.MySQL InnoDB锁的基本类型
// TODO https://www.bilibili.com/video/BV1KW411u7vy
本文深入探讨了数据库事务的四大特性:原子性、一致性、隔离性和持久性,并详细解析了脏读、不可重复读和幻读现象。接着,介绍了四种数据库隔离级别,包括ReadUncommitted、ReadCommitted、RepeatableRead和Serializable,以及它们对并发问题的处理。在MySQL InnoDB中,重点讲解了其对事务隔离级别的支持和MVCC(多版本并发控制)的工作原理,以及快照读和当前读的概念。此外,还概述了InnoDB的锁类型,为理解数据库并发提供了全面的知识框架。
1142

被折叠的 条评论
为什么被折叠?



