隔离级别:ACID
读未提交
读已提交
不可重复读
串行
- 脏读:事务A读取到了事务B还未提交的数据
- 不可重复读:事务A在多次读取某数据时,读取到了事务B已经提交(update、delect)的数据,导致事务A前后读取结果不一致
- 幻读:事务A在多次统计数据时,统计到了事务B已经提交的insert数据,导致事务A的前后统计结果不一致
事务隔离级别
|
隔离级别 |
脏读 |
不可重复读 |
幻读 |
备注 |
|
读未提交 (Read UnCommitted) |
N |
N |
N | |
|
读已提交(Read Committed) |
Y |
N |
N |
Oracle 默认级别 |
|
可重复读( RepeaTable Read) |
Y |
Y |
N |
mysql 默认级别 |
|
串行(Serializable) |
Y |
Y |
Y |
mysql是如何实现事务隔离级别的?
INNDB:表锁、行锁
MyISAM:表锁
|
加锁粒度 |
执行效率 |
冲突概率 |
并发性能 | |
|
表锁 |
大 |
快 |
大 | |
|
行锁 |
好 |

锁的模式
- 共享锁 S锁 :读可重入,即多个事务可在同一行加锁,但是不能修改,如果想要修改,只能等待所有的S锁释放;
例子:select * from table lock in share mode;
小插曲:老师用动物园出入口的闸机举例子,说明读锁的必要性。我却在把闸机联想成了炸鸡!!!!
- 排它锁 X锁:对某一资源进行修改时,只有此事务可以增删改查,其他事务都不能进行操作
例子:所有的DML语句自动带有排它锁;
- 意向锁 :由共享锁/排他锁触发,是为了提高加表锁的效率;
锁的算法

MVCC:
会记录最大的事务id,transcation_id,也就是row_id
快照读
当前读:也就是修改的时候,会再读取一遍数据库中最新的数据
面试题:问Q1 Q2的输出值?age初始值为18

本文详细介绍了数据库的ACID属性以及四种事务隔离级别:读未提交、读已提交、可重复读和串行化,分别阐述了它们对脏读、不可重复读和幻读的支持情况。在MySQL中,InnoDB引擎使用行锁和表锁实现事务隔离,而MyISAM则采用表锁。此外,还探讨了MVCC(多版本并发控制)的概念,如快照读和当前读。文章通过实例解释了MVCC如何避免并发问题,并给出了相关面试题。
2203





