oracle如何保證數據一致性和避免臟讀

oracle通過undo保證一致性讀和不發生臟讀

1.不發生臟讀
2.一致性讀
3. 事務槽(ITL)小解

1.不發生臟讀

例如:用戶A對表更新了,沒有提交,用戶B對進行查詢,沒有提交的更新不能出現在用戶的查詢結果中

舉例并通個dump數據塊說明避免臟讀的原理

創建測試表,并插入兩條記錄,會話A執行更新但不提交

  1. SQL>select*from test;
  2. ID NAME
  3. --------------------
  4. 1 A
  5. 2 B
  6. SQL> update test set name='C'where id=2;
  7. 1 row updated.

會話B查詢,數據沒變

  1. SQL>select*from test;
  2. ID NAME
  3. --------------------
  4. 1 A
  5. 2 B

通過下面sql語句查詢數據所在的數據文件和塊號,并進行dump

  1. SQL>select id, rowid, dbms_rowid.rowid_relative_fno(rowid) fn,dbms_rowid.rowid_block_number(rowid) bk from test order by id;
  2. ID ROWID FN BK
  3. ------------------------------------------------
  4. 1AAAzkeAAIAAAACDAAA8131
  5. 2AAAzkeAAIAAAACDAAB8131
  6. SQL> alter system dump datafile 8 block 139;
  7. System altered.

未提交的數據塊dump結果

  1. ItlXidUbaFlagLckScn/Fsc
  2. 0x010x0002.001.000a90a20x00c00093.9f1d.16 C---0 scn 0x0000.395178de
  3. 0x020x0007.010.000a93c50x00c00f4b.9f5d.34----1 fsc 0x0000.00000000
  4. ---上面事務槽中Flag----0x00c00f4b undo地址中讀取
  5. bdba:0x0200008b
  6. data_block_dump,data header at 0x7fb742fc8a64
  7. ===============
  8. tsiz:0x1f98
  9. hsiz:0x16
  10. pbl:0x7fb742fc8a64
  11. 76543210
  12. flag=--------
  13. ntab=1
  14. nrow=2
  15. frre=-1
  16. fsbo=0x16
  17. fseo=0x1f88
  18. avsp=0x1f70
  19. tosp=0x1f70
  20. 0xe:pti[0] nrow=2 offs=0
  21. 0x12:pri[0] offs=0x1f90
  22. 0x14:pri[1] offs=0x1f88
  23. block_row_dump:---下面是表中數據行的dump
  24. tab 0, row 0,@0x1f90
  25. tl:8 fb:--H-FL-- lb:0x0 cc:2
  26. col 0:[2] c1 02
  27. col 1:[1]41--第一行 A
  28. tab 0, row 1,@0x1f88
  29. tl:8 fb:--H-FL-- lb:0x2 cc:2---lb0x2說明未提交
  30. col 0:[2] c1 03
  31. col 1:[1]43---第二行 C
  32. end_of_block_dump

說明:通過上面的dump文件發現,數據已經被修改成C(43),但是Oracle發現這條數據有lb: 0x2 對應的是ITL,從ltl為0x02的記錄看到flag為—-,表示有事務標記,數據被加鎖,需要從undo段的uba(undo block address)中讀取

undo段中對應的塊信息為:0x00c00f4b,這里是十六進制,下面先轉換成10進制

  1. SQL>select to_number('00c00f4b','XXXXXXXXXXXXXXX')from dual;
  2. TO_NUMBER('00C00F4B','XXXXXXXXXXXXXXX')
  3. ---------------------------------------
  4. 12586827
  5. 得到值為12586827

對undo塊進行dump

  1. 在通過下面的語句得到數據塊信息:
  2. SQL>select dbms_utility.data_block_address_file(12586827), dbms_utility.data_block_address_block(12586827)from dual;
  3. DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(12586827) DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(12586827)
  4. ---------------------------------------------------------------------------------------------
  5. 33915
  6. SQL>select file#,name from v$datafile where file#=3;
  7. FILE# NAME
  8. ------------------------------------------------------------
  9. 3/u01/app/oracle/oradata/FGLDB/undotbs01.dbf
  10. SQL> alter system dump datafile 3 block 3915;
  11. System altered.

dump內容如下:

  1. *-----------------------------
  2. *Rec#0x34 slt: 0x10 objn: 211231(0x0003391f) objd: 211231 tblspc: 4(0x00000004) --objd 為object id
  3. *Layer:11(Row) opc:1 rci 0x00
  4. Undo type:Regular undo Begin trans Last buffer split:No
  5. TempObject:No
  6. TablespaceUndo:No
  7. rdba:0x00000000Ext idx:0
  8. flg2:0
  9. *-----------------------------
  10. uba:0x00c00f4b.9f5d.25 ctl max scn:0x0000.39516d48 prv tx scn:0x0000.39516db3
  11. txn start scn: scn:0x0000.395178de logon user:83
  12. prev brb:12586818 prev bcl:0
  13. KDO undo record:
  14. KTB Redo
  15. op:0x03 ver:0x01
  16. compat bit:4(post-11) padding:1
  17. op: Z
  18. ArrayUpdate of 1 rows:
  19. tabn:0 slot:1(0x1) flag:0x2clock:0 ckix:12
  20. ncol:2 nnew:1 size:0
  21. KDO Op code:21 row dependencies Disabled
  22. xtype:XAxtype KDO_KDOM2 flags:0x00000080 bdba:0x0200008b hdba:0x0200008a
  23. itli:2 ispac:0 maxfr:4858
  24. vect =3
  25. col 1:[1]42--- undo中數據為B

從undo塊中發現值為B(42),故其他用戶看到的是B,看不到C,避免了臟讀

附:提交后的數據塊dump結果

  1. ItlXidUbaFlagLckScn/Fsc
  2. 0x010x0002.001.000a90a20x00c00093.9f1d.16 C---0 scn 0x0000.395178de
  3. 0x020x0007.010.000a93c50x00c00f4b.9f5d.34 C---0 scn 0x0000.39517d7a
  4. ---FlagC---
  5. bdba:0x0200008b
  6. data_block_dump,data header at 0x7fa3c77efa64
  7. ===============
  8. tsiz:0x1f98
  9. hsiz:0x16
  10. pbl:0x7fa3c77efa64
  11. 76543210
  12. flag=--------
  13. ntab=1
  14. nrow=2
  15. frre=-1
  16. fsbo=0x16
  17. fseo=0x1f88
  18. avsp=0x1f70
  19. tosp=0x1f70
  20. 0xe:pti[0] nrow=2 offs=0
  21. 0x12:pri[0] offs=0x1f90
  22. 0x14:pri[1] offs=0x1f88
  23. block_row_dump:
  24. tab 0, row 0,@0x1f90
  25. tl:8 fb:--H-FL-- lb:0x0 cc:2
  26. col 0:[2] c1 02
  27. col 1:[1]41
  28. tab 0, row 1,@0x1f88
  29. tl:8 fb:--H-FL-- lb:0x0 cc:2--- lb0x0
  30. col 0:[2] c1 03
  31. col 1:[1]43
  32. end_of_block_dump


總結:數據庫通過判斷數據塊頭部的ITL槽的信息來確定是否有未提交的事務,如果事務槽Flag為—-,則通過事務槽中的undo塊地址查詢到原來的數據,進而達到數據隔離的效果,避免臟讀。

2.一致性讀

例如:假設某一個用戶A在6點對某一個表發出了一個查詢數據量很大的數據,需要15分鐘才能把結果完全查詢出來,在這期間,6點10分用戶B對數據進行了更新并提交了,用戶A查詢的結果仍然是6點時候的表的數據,用戶B更新的數據不出現在用戶A的查詢結果中,這就是一致性讀。

  1. 用戶A在執行開始的時候會記錄當時的SCN號,如圖中10021
  2. 在每次從數據塊中讀數據的時候會比較記錄的SCN號和數據塊事務槽中的SCN號(下一個事務的SCN號一定比當前的大)
    a.如果數據塊中的SCN比當前分配的SCN號小,則認為該數據沒有被修改,直接讀取;
    b.如果數據塊中的SCN號比當前分配的SCN大,則根據塊中保存的地址去undo中讀取當時分配SCN時間點的數據(根據undo數據塊在內存中重新構造出該數據塊,稱為consistent read (CR)塊)

    一個查詢如果耗費很長時間,而查詢的結果在查詢的階段被更改了,而且對應著undo段的數據已經被清理了,就會發生Oracle中著名的ORA-01555: snapshot too old(快照太久)錯誤。

    如果一條數據在查詢期間被更新過多次并且提交,后放入undo段的塊會記錄相對的塊上次放在undo段中的塊地址,從而一路尋找到查詢開始時間點在undo段中的數據塊。

3. 事務槽(ITL)小解


ITL(Interested Transaction List)是Oracle數據塊內部的一個組成部分,位于數據塊頭(block header),itl由xid,uba,flag,lck和scn/fsc組成,用來記錄該塊所有發生的事務,一個itl可以看作是一條事務記錄。當然,如果這個事務已經提交,那么這個itl的位置就可以被反復使用了,因為itl類似記錄,所以,有的時候也叫itl槽位。如果一個事務一直沒有提交,那么,這個事務將一直占用一個itl槽位,itl里面記錄了事務信息,回滾段的入口,事務類型等等。如果這個事務已經提交,那么,itl槽位中還保存的有這個事務提交時候的SCN號。

?

Xid:事務id,在回滾段事務表中有一條記錄和這個事務對應
Uba:回滾段地址,該事務對應的回滾段地址

  • 第一段地址:回滾數據塊的地址,包括回滾段文件號和數據塊號
  • 第二段地址:回滾序列號
  • 第三段地址:回滾記錄號
    –查看UBA
    SELECT UBAFIL undo_file_id,UBABLK undo_blk_num,UBASQN undo_segment_num,UBAREC undo_recode_num FROM v$transaction;

Flag:事務標志位。這個標志位就記錄了這個事務的操作,各個標志的含義分別是:

  • —– = 事務是活動的,或者在塊清除前提交事務
  • C— = 事務已經提交并且清除了行鎖定。
  • -B– = this undo record contains the undo for this ITL entry
  • –U- = 事務已經提交(SCN已經是最大值),但是鎖定還沒有清除(快速清除)。
  • —T = 當塊清除的SCN被記錄時,該事務仍然是活動的,塊上如果有已經提交的事務,

那么在clean ount的時候,塊會被進行清除,但是這個塊里面的事務不會被清除。

Lck:影響的記錄數

Scn/Fsc:快速提交(Fast Commit Fsc)的SCN或者Commit SCN。

每條記錄中的行級鎖對應于Itl列表中的序號,即哪個事務在該記錄上產生的鎖。


關注公眾號:數據庫技術分享,不定期分享技術干貨

轉載于:https://www.cnblogs.com/haoxiaoyu/p/314e2d07c0ab6c86a6378d79fd0facdf.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370817.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Google Guava BloomFilter

當Guava項目發布版本11.0時,新添加的功能之一是BloomFilter類。 BloomFilter是唯一的數據結構,用于指示元素是否包含在集合中。 使BloomFilter有趣的是,它將指示元素是否絕對不包含或可能包含在集合中。 永遠不會出現假陰性的特性使BloomFil…

php 編程祝新年快樂_用于測試自動化的7種編程語言

導讀:本文重點介紹測試自動化中排名前七位的編程語言。當人們想要開始做自動化測試,此時卻需要開發自動化測試腳本,也就是要學習一門編程語言。那么,我們怎樣邁出這一步?也有你已經精通一種編程語言,也可以…

Day1 了解web前端

Day1 了解web前端 一.職業發展路線: 前端頁面制作、前端開發、前端架構師 二.1)前端工程師主要職責: 利用HTML/CSS/JavaScript等各種Web技術進行客戶端產品的開發。完成客戶端程序(也就是瀏覽器端)的開發,同時結合后臺技術模擬整體效果&am…

已阻止應用程序訪問圖形硬件_玩轉智能硬件之Jetson Nano(三)深度學習環境搭建...

0、前言iotboy:玩轉智能硬件(一)Jetson Nano安裝篇?zhuanlan.zhihu.comiotboy:玩轉智能硬件(二)Jetson Nano配置篇?zhuanlan.zhihu.com在玩轉智能硬件(一)和(二&#x…

Vue.js開發環境搭建的介紹

包含了最基礎的Vue.js的框架,包含了打包工具和測試工具,開發調試的最基本的服務器,不需要關注細節,只需關注Vuejs對項目的實現 npm在國內的網絡使用較慢,所以推薦下載安裝淘寶的鏡像 1: 2:安裝c…

html文件轉換html格式,pdf文件怎么轉換成html格式

PDF文件怎么轉換成html格式呢?html格式其實就是網頁格式,PDF文件和網頁文件一般情況下是兩種完全不搭邊的格式,但是不可否定的是辦公室的多樣化總有人會有這樣的需求,只要有需求就會有其相應的解決方案。我們可以利用PDF轉Word一樣…

Eclipse中的Github Gists

我想描述有關在Eclipse中集成GitHub Gists的簡單步驟。 有幾個來源促使我這樣做: Eclipse的GitHub Mylyn連接器 EGit / GitHub /用戶指南 http://eclipse.github.com 我一直在使用Eclipse Java EE發行版,其中已經安裝了Mylyn插件: 1.通…

CSS3景深-perspective

3D視圖正方體&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>CSS3景深-perspective</title>6 </head>7 <style>8 #div1{9 position: rel…

python pool_派松水潭(Python Pool)

派松水潭(Python Pool)旅游景點類型&#xff1a;名勝Roebourne Winternoom Road , Roebourne , Western Australia , 6718Email:roetourbigpond.net.auWebsite:www.pilbaracoast.com派松水潭(Python Pool)坐落于羅伯恩(Roebourne)以南風景如畫的米爾斯特姆-奇切斯特國家公園內。…

【BZOJ4262】Sum 單調棧+線段樹

【BZOJ4262】Sum Description Input 第一行一個數 t&#xff0c;表示詢問組數。第一行一個數 t&#xff0c;表示詢問組數。接下來 t 行&#xff0c;每行四個數 l_1, r_1, l_2, r_2。Output 一共 t 行&#xff0c;每行一個數 Sum。Sample Input 4 1 3 5 7 2 4 6 8 1 1 9 9 9 9 1…

父類一實現serializable_我的java基礎學習易錯點和易忘點總結(一)

一.繼承A:子類只能繼承父類所有非私有的成員(成員方法和成員變量)B:子類不能繼承父類的構造方法&#xff0c;但是可以通過super關鍵字去訪問父類構造方法。二.繼承中構造方法的關系A:子類中所有的構造方法默認都會訪問父類中空參數的構造方法B:為什么呢?因為子類會繼承父類中的…

Avocado 安裝和簡單測試

1.Avocado 安裝 1.1 通過包安裝 像Fedora可以通過rpm包進行安裝&#xff0c;其他通過RPM管理的發行版需要自己制作相關包。Avocado同樣支持DEP包的安裝可以在contrib/packages/debian找到。 Fedora 首先通過下面的命令獲取倉庫配置文件。 sudo curl https://repos-avocadoproje…

html文檔主體的根標簽,2 HTML簡介標簽嵌套和并列關系文檔聲明

HTML&#xff1a;Hyper Text Markup Language 超文本標簽語言(hyper&#xff1a;精力旺盛的 markup:標記 n noun)HTML不是編程語言&#xff0c;而是一種標記語言(就是一套標記標簽)&#xff0c;用于描述網頁&#xff0c;是網頁制作必備的。超文本是指頁面內可以包含圖片、鏈接…

深入克隆

在繼續克隆概念之前&#xff0c;讓我們用對象創建概念刷新基礎知識。 使用new運算符創建對象時&#xff0c;對象將在堆中獲取內存分配。 堆中的對象創建 在Java中&#xff0c;理想情況下僅通過引用變量修改對象&#xff0c;即僅復制對象的內存地址&#xff0c;因此原始對象中…

c# 口口亂碼_c# 亂碼解決方法

1 設置web.configrequestEncoding"utf-8"responseEncoding"utf-8"fileEncoding"utf-8"/>如果相應使用gb2312 &#xff0c;則html頁面也要設置相同&#xff0c;解決亂碼。如果為 utf-8 &#xff0c;則相應的html文件的屬性要轉換成utf-8保存&a…

《你的燈亮著嗎?》個人總結

我要如何去解決問題 搞清楚問題是什么 問題就是我們的體驗和期待的所產生的差異 * 問題的本質 * 問題的定義 * 問題的產生 * 問題的表述誰需要解決問題要多維的看待問題問題來自哪里問題的解決方法在特定的層面上去解決問題問題的解決是要交給能解決問題的人--誰能解決問題別輕…

html文檔的文件頭的主要作用是什么,文件頭

本詞條缺少概述圖&#xff0c;補充相關內容使詞條更完整&#xff0c;還能快速升級&#xff0c;趕緊來編輯吧&#xff01;文件頭是位于文件開頭的一段承擔一定任務的數據&#xff0c;一般都在開頭的部分。中文名文件頭位 置位于文件開頭任 務承擔一定任務的數據類 別文…

索引和未索引執行計劃的比較_詳解Oracle復合索引+實例說明

復合索引復合索引顧名思義&#xff0c;區別于單列索引&#xff0c;是由兩個或多個列一起構成的索引。其在B樹上的數據結構是什么樣&#xff1f;如下圖&#xff0c;是一個包含兩列的復合索引。如果你觀察仔細&#xff0c;還會發現它的葉子節點是ASC遞增排序的。現根據第一個值排…

Datables使用總結

本文共四部分&#xff1a;官網 | 基本使用|遇到的問題|屬性表 一&#xff1a;官方網站&#xff1a;[http://www.datatables.net/] 二&#xff1a;基本使用&#xff1a;[http://www.guoxk.com/node/jquery-datatables] 1、DataTables的默認配置 $(document).ready(function() { …

python面向窗體的開發_Python高級進階#019 pyqt5菜單menu應用,新建多窗體

知識回顧&#xff1a;1.掌握的是QCalendarWidget日歷控件2.click點擊事件(信號)觸發3.掌握日期的格式化QDate本節知識視頻教程以下開始文字講解&#xff1a;一、案例&#xff1a;菜單1.新建第一個窗體2.一級菜單的配置3.二級菜單的配置4.利用菜單功能實現界面跳轉&#xff0c;實…