Oracle ACID 实现机制

REDO UNDO日志模拟

在这里插入图片描述

事务原子性:

原子性指的就是事务里面的所有操作要么全部成功,要么全部失败。所以我们如果执行到一半的情况下发现了其中的操作进行失败了,这个时候我们应该把前面执行成功的一半记录进行还原。
这个有点难啊?覆水怎么还可以收回呢?现在抖音上面就可以做到,是怎么的做到的呢?那就是时间回流?
只要我们记录下面开始操作的状态,就可以进行回滚,这个就是上面里面的undo日志,在事务回滚了,我们只需要把我们进行的改变一一回滚即可。那么如果在你进行操作的时候,另外一个事务已经进行commit这一行了,不会的,数据库在更新的时候,会添加排他锁的。

数据的一致性如何实现?

数据的一致性指的就是用户在看到这个记录的应该是已经提交过的记录,而不是中间状态的记录。
在oracle中,根据SCN(System Change Numer)来判断这个数据是否进行了改变,如果一个活动事务把这个数据进行了改变,那么对应的SCN数字就会向上增。并且如果事务还没有提交,这个事务就会被放在活动事务里面,每次读取的话,就会读取一个最大的已提交事务版本的值,所以可以实现READ_COMMITED,并且ORACLE默认的就是READ_COMMITED。

事务隔离性怎么实现?

事务隔离性包括 READ_UNCOMMITED、READ_COMMITED、REPETA_READ、SERIALIZED。
那么在Oracle里面默认的隔离级别的是READ_COMMITED。

持久化如何实现?

它是由刷盘下DBWR(DB Writer)在CKPT(checkpoint)的触发下进行的,但是这个并不能保证所有的数据都被持久化,其实更多还是由REDO/UNDO日志保证的,每次COMMIT都会触发LGWR(LogWriter)写日志,并且这个是直接写入到磁盘里面的。这样数据库在宕机重启的时候就会根据重做日志进行数据的恢复,并且根据UNDO日志将未COMMIT的事务进行回滚。
UPDATE 场景:
假如事务里面有三个更新操作,如果执行了两个操作系统就宕机了?那么重启起来是怎么做的呢?
首先根据前面的两个操作的redo日志,然后系统会构造出来对应的undo日志和数据块,然后再根据undo进行回滚,为什么不直接回滚呢?因为现在数据库里面对应的数据块还没有存在

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章