0
点赞
收藏
分享

微信扫一扫

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

青乌 19小时前 阅读 1

数据库管理171期 2024-04-18

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

突然发现,正儿八经的继续写系列的上一篇文章已经是8天前了,罪过罪过啊,今天趁着在机场等飞机的时间,写一篇与Oracle相关很基础的技术文章,回头再写写UNDO。

1 基本概念

Oracle数据库创建并管理用于回滚或UNDO对数据库的更改的信息。此类信息包括事务行为的记录,主要是在事务被提交之前。这些记录统称为UNDO。
REDO与UNDO:

  • REDO LOG记录的是事务的前滚信息(即对数据的操作记录),记录在Online Redo Log中,并根据数据库配置转储至归档指定目录的归档日志之中。
  • UNDO则记录与REDO相反的操作信息,这些信息被记录在数据库配置的实例对应的UNDO表空间之中。

REDO和UNDO可以比作为双胞胎,产生REDO的同时会记录UNDO数据。

2 用处

Oracle数据库使用UNDO数据来回滚事务、提供读一致性、用于数据恢复并提供类似于闪回查询的功能。
这里以一个UPDATE操作为例:
A表信息:

create table A (id number primary key,name number);
insert into A values (1,1);
commit;

image.png
这里提交一个UPDATE操作单不提交:

update A set name=name+1 where id=1;
select * from A;

image.png
这时候在内存中,涉及ID为1的这一行数据会被变更,同时产生REDO信息,用于在commit时将数据写入磁盘。同时也会产生UNDO信息,当这个事务还没有commit时,其他会话需要读相同数据时,通过与当前内存中数据与UNDO组合得到事务之前的数据:
image.png
当然如果事务回滚,也是使用UNDO数据来回退内存中的数据。但现在如果还有会话需要操作ID为1的这行数据呢:
image.png
这时候就会因为前一个事务的行锁,导致语句处于挂起的状态,在这种情况下,这个事务是不会产生任何REDO和UNDO信息,直至前一个事务提交或回滚。而如果两个会话提交,而需要通过闪回查询的方式查询第一个事务之前的数据,Oracle数据库就会通过当前内存中的对应数据信息加上两份UNDO信息组合出需要的数据。

3 注意事项

Oracle数据库自动确保活动事务正在使用的撤消数据在提交该事务之前永远不会被覆盖。数据库服务器维护并自动调整UNDO保留期,以确保Oracle Flashback功能的成功,并确保长时间运行的查询的读取一致性。创建数据库时,将启用UNDO保留期的自动调整。

  • UNDO_TABLESPACE
    对于Oracle数据库一个实例有且仅有一个UNDO表空间生效,从12.2开始配置local undo的情况下,每个PDB在每个实例上也有一个对应的UNDO表空间。
ALTER SYSTEM SET UNDO_TABLESPACE='UNDOTBS1' SID='DBAAS1';
  • UNDO_RETENTION
    配置数据库的UNDO保留时长,以秒为单位,这里需要注意,如果UNDO表空间容量不足且对应事务已完成,那么未达到配置保留时长的情况下,UNDO信息依然可能被清理;反之,如果UNDO表空间空间较大,超过UNDO保留时间的UNDO数据仍可能可使用。
ALTER SYSTEM SET UNDO_RETENTION=xxx;
  • UNDO GUARANTEE
    Oracle提供确保UNDO信息保留至设置保留时间的配置方式,但是需要注意,这一配置可能造成UNDO表空间容量不可控,且可能导致多DML操作失败,所以一般不做该项配置。
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;

关于其他相关配置就建议按照默认即可,无需修改。

总结

本期讲解了UNDO是如何确保Oracle的读一致,同时整理了一下UNDO相关注意事项。
老规矩,知道写了些啥。

举报

相关推荐

0 条评论