您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。 [云和恩墨技术研究院]:Oracle写冲突解决方案——更新重启动 - 发现报告

Oracle写冲突解决方案——更新重启动

2024-04-26 云和恩墨技术研究院 「若久」
报告封面

Oracle写冲突解决方案——更新重启动 杨廷琨云和恩墨技术研究院总经理 目录CONTENTS Oracle的并发策略 01 更新重启动的产生 02 更新重启动的监控 03 国产化替代的启迪 04 O r a c l e的 并 发 策 略 并 发 读 取 ●读共享●read by other session 并 发 读 写 ●读不阻塞写,写不阻塞读●多版本读一致性●data blocks consistent reads-undo records applied 并 发 修 改 ●锁●Enq: TX–row lock contention●更新重启动 目录CONTENTS Oracle的并发策略 01 更新重启动的产生 02 更新重启动的监控 03 04国产化替代的启迪 更 新 重 启 动 的 产 生 并 发 读 取 ●Oracle读取数据时,会将文件中的块加载到内存中共享。 并 发 读 写 ●如果当前读取的数据块被修改过,则会构造读一致性,通过UNDO记录在内存中回滚修改还原数据块的前镜像,把数据块还原到查询发生的时刻●Oracle实现的读一致性也被称为多版本读一致性,每个会话都会构造自己的一致性查询版本。 并 发 修 改 ●对于写操作而言,因为数据只有一份,就只能修改唯一的这份数据●读操作,访问的是一致性版本,写操作,修改的永远是当前版本,并发修改相同记录通过加锁来控制一致性●写操作执行的过程中,发现要修改的记录发生了变化,破坏了更新发起时刻的一致性,这时就触发了更新重启动,也就是说更新操作会放弃之前的修改,然后重新发起一次新的更新操作。 更 新 重 启 动 的 产 生 SQL>INSERT INTO T_UPDATE SELECT ROWNUM FROM DUAL CONNECT BY LEVEL<4;3rows created. Commitcomplete. 更 新 重 启 动 的 产 生 更 新 重 启 动 ●更新过程中发现要更新的记录发生修改 ●为了避免更新的结果导致不一致性,已更新记录回滚 ●重新发起更新操作 更 新 重 启 动 的 产 生 SQL2>ROLLBACK;Rollbackcomplete.SQL2>DELETE T_UPDATE WHERE ID>4;1row deleted.SQL2>UPDATE T_UPDATE SET ID=3 WHERE ID=4;1row updated.SQL2>COMMIT;Commitcomplete.SQL2>SELECT*FROM T_UPDATE;ID----------123 更 新 重 启 动 的 产 生 SQL>CREATE USER U_UPDATE IDENTIFIED BY TESTUPDATE;Usercreated.SQL>GRANT CREATE SESSION TO U_UPDATE;Grantsucceeded.SQL>CREATE USER U_OWNER IDENTIFIED BY OWNERTEST;Usercreated.SQL>GRANT CONNECT,RESOURCE TO U_OWNER;Grantsucceeded.SQL>GRANT UNLIMITED TABLESPACE TO U_OWNER;Grantsucceeded. 更 新 重 启 动 的 产 生 SQL>CONN U_OWNER/OWNERTEST@freepdb1Connected.SQL>CREATE TABLE T(ID NUMBER,NAME VARCHAR2(30));Tablecreated.SQL>INSERT INTO T VALUES(1,'ABC');1row created.SQL>COMMIT;Commitcomplete.SQL>GRANT UPDATE ON T TO U_UPDATE;Grantsucceeded. 更 新 重 启 动 的 产 生 SQL>CONN U_UPDATE/TESTUPDATE@freepdb1Connected. SQL>UPDATE U_OWNER.T SET NAME='BCD'; SQL>UPDATE U_OWNER.T SET NAME='CDE'WHERE ID=1;UPDATEU_OWNER.T SET NAME='CDE'WHERE ID=1 ERRORat line 1: ORA-41900:missing SELECT privilege on"U_OWNER"."T" 更 新 重 启 动 的 产 生 更 新 重 启 动 ●更新过程中发现要更新的记录与更新查询条件不一致●为了避免更新的结果导致不一致性,已更新记录回滚●为了确保再次更新不会失败,使用SELECT FOR UPDATE获取锁●重新发起更新操作 目录CONTENTS Oracle的并发策略 01 更新重启动的产生 02 更新重启动的监控 03 04国产化替代的启迪 更 新 重 启 动 的 监 控 ●避免查询和DML操作结果不一致●数据库一致性的深度保护 更新重启动的意义 ●回滚后重新执行,操作时间变长资源消耗大●多个并行写操作可能出现执行顺序改变 更新重启动的代价 ●定性:统计信息●定量:日志挖掘 更新重启动的监控 更 新 重 启 动 的 监 控 SQL2>SELECT NAME,VALUE 2FROMV$MYSTAT M,V$STATNAME S3WHEREM.STATISTIC#=S.STATISTIC#4ANDM.CON_ID=S.CON_ID5ANDNAME IN('rollback changes-undo records applied','transaction rollbacks'); NAMEVALUE rollbackchanges-undo records applied2 transactionrollbacks0 更 新 重 启 动 的 监 控 SQL3>CONN/AS SYSDBA Connected. SQL3>SELECT SEQUENCE#,MEMBER FROM V$LOG L,V$LOGFILE LF2WHEREL.GROUP#=LF.GROUP#3ANDL.STATUS='CURRENT';SEQUENCE#MEMBER 1479/opt/oracle/oradata/FREE/redo03.log SQL3>ALTER SYSTEM SWITCH LOGFILE; Systemaltered. SQL3>EXEC DBMS_LOGMNR.ADD_LOGFILE('/opt/oracle/oradata/FREE/redo03.log')PL/SQLprocedure successfully completed.SQL3>EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)PL/SQLprocedure successfully completed. 更 新 重 启 动 的 监 控 S Q L 3>S E L E C T S C N,O P E R A T I O N ,R O L L B A C K ,R O W _ I D,S Q L _ R E D O F R O M V $ L O G M N R _ C O N T E N T S W H E R E T A B L E _ N A M E='T _ U P D A T E' ; S C NO P E R A T I O N R O L L B A C K R O W _ I DS Q L _ R E D O- - - - - - - - -- - - - - - - - -- - - - - - - -- - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -8 6 7 6 5 3 7 1 2I N S E R T0A A A 5 f 1 A A P A A A 4 C M A A A i n s e r t i n t o"U 1" . "T _ U P D A T E" ( " I D " )v a l u e s( ' 1 ' ) ;8 6 7 6 5 3 7 1 2I N S E R T0A A A 5 f 1 A A P A A A 4 C M A A B i n s e r t i n t o"U 1" . "T _ U P D A T E" ( " I D " )v a l u e s( ' 2 ' ) ;8 6 7 6 5 3 7 1 2I N S E R T0A A A 5 f 1 A A P A A A 4 C M A A C i n s e r t i n t o"U 1" . "T _ U P D A T E" ( " I D " )v a l u e s( ' 3 ' ) ;8 6 7 6 5 3 7 5 0U P D A T E1A A A 5 f 1 A A P A A A 4 C M A A B u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 2 'w h e r e R O W I D='A A A 5 f 1 A A P A A A 4 C M A A B' ;8 6 7 6 5 3 7 5 0U P D A T E1A A A 5 f 1 A A P A A A 4 C M A A A u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 1 'w h e r e R O W I D='A A A 5 f 1 A A P A A A 4 C M A A A' ;8 6 7 6 5 3 7 5 0U P D A T E0A A A 5 f 1 A A P A A A 4 C L A A A u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 5 . 1 'w h e r e" I D "=' 5 'a n d R O W I D='A A A 5 f 1 A A P A A A 4 C L A A A' ;8 6 7 6 5 3 7 5 0U P D A T E0A A A 5 f 1 A A P A A A 4 C M A A A u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 1 . 1 'w h e r e" I D "=' 1 'a n d R O W I D='A A A 5 f 1 A A P A A A 4 C M A A A' ;8 6 7 6 5 3 7 5 0U P D A T E0A A A 5 f 1 A A P A A A 4 C M A A B u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 2 . 1 'w h e r e" I D "=' 2 'a n d R O W I D='A A A 5 f 1 A A P A A A 4 C M A A B' ;8 6 7 6 5 3 7 5 0U P D A T E0A A A 5 f 1 A A P A A A 4 C M A A C u p d a t e"U 1" . "T _ U P D A T E"s e t" I D "=' 4 . 1 'w h e r