数据库undo与redo日志、事务的隔离级别

数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。
数据库undo与redo日志、事务的隔离级别_第1张图片

数据库undo与redo日志、事务的隔离级别_第2张图片

理解事务隔离级别,需要明确数据库中的事务机制:
数据库undo与redo日志、事务的隔离级别_第3张图片

undo日志

数据库事务四大特性中有一个是原子性 ,具体来说就是原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。
实际上, 原子性底层就是通过undo log实现的。undo log主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态。

redo日志

mysql 每执行一条 DML语句,先将记录顺序追加写入 redo log buffer并更新内存中的数据,等到有空闲线程、内存不足、Redo Log满时再批量落盘持久化。
Redo用来保证事务的原子性和持久性,Undo能保证事务的原子性和一致性,两者也是系统恢复的基础前提。

1. Read UnCommitted(未提交,可读)

最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。
eg. A事务读出的状态是未售出,同时B事务也读出是未售出,两者都预定了这个座位,导致错误。此时,需要使得A可读取B的未提交数据,才能解决问题。
数据库undo与redo日志、事务的隔离级别_第4张图片

2. Read Committed(提交后,可读)

大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
eg. B修改了自己的undo日志(4900),若A在B未提交时读取了B的undu日志(4900),并进行了转账操作,保存到A的undo日志中(5900),若B按照redo日志回滚,当A提交后结果变为5900。这种情况就需要要求:A只有在B提交后,才能读数据库中的数据。
数据库undo与redo日志、事务的隔离级别_第5张图片

3. Repeatable Read(重复读)

mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。
eg. 当A事务下单后(还未提交),紧接着B事务就将商品涨价,但是A事务提交后应该仍然按照涨价之前的价钱支付,此时就需要“可重复读”级别的事务隔离机制,保证A事务的执行不受其他事务行为的影响。
数据库undo与redo日志、事务的隔离级别_第6张图片

4. Serializable(序列化)

最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。

你可能感兴趣的:(java面试相关,数据库,mysql,dba)