oracle資料併發性和一致性
1.oracle資料庫的一致性是透過多版本一致性模型和多種型別的鎖和事務來實現的。
2.oracle的多版本一致性讀,使得oracle查詢具有讀一致性查詢和非阻塞讀兩個特性。
3.語句級的一致性指查詢返回的結果與發起查詢的時間點保持一致並且當時已提交的資料。例如:
當SQL語句在SCN=1000發起,則在提交讀的隔離級別下,返回的結果和SCN=1000保持一致;
在序列化或者只讀的事務中,事務中所有的查詢都與事務開始時間點保持一致;
在閃回查詢中,查詢結果和語句中指定的時間點保持一致。
4.事務界別的一致性:
即oracle可以保證事務中的所有語句查詢的結果和事務開始時間點保持一致。
序列化事務中的查詢可以看到事務自身引起的修改。
事務級別的一致性可以保證可重複讀,但是不保證幻影讀。
5.讀一致性和undo段
oracle的讀一致性和非阻塞讀主要透過undo來實現,在undo段中存放事務所做的修改的舊值,這樣某事務進行過程中,可以對事務外查詢提供舊值的查詢,即讀一致性。
6.讀一致性和事務表
每個資料塊的塊頭都有一個ITL(interested transaction list),當oracle需要對資料塊進行修改時,會利用ITL來判斷事務是否提交。(oracle預設的隔離級別為提交讀,不會讀取未提交事務的資料)
ITL裡的內容描述了哪些事務在資料塊中有行鎖和哪些行被已提交或未提交事務做了改變。
ITL指向UNDO段裡的事務表,事務表裡記錄了資料庫發生的所有改變的時序。
從某種意義上來說,ITL裡記錄了最近資料塊裡所有的被改變行記錄的歷史資訊,INITRANS引數決定了資料塊裡保留的事務歷史。
7.鎖機制
一般來說,多使用者的資料庫使用資料鎖來解決與資料併發性、一致性和完整性相關的問題。鎖主要是阻止訪問相同資源的事務之間發生破壞性的影響。
8.ANSI/ISO的事務隔離級別
隔離級別 | 髒讀 | 不可重複讀 | 幻影讀 |
read uncommited | Y | Y | Y |
read commited(oracle預設提供) | N | Y | Y |
repeatable read | N | N | Y |
serializalble | N | N | N |
其中,髒讀是指讀取到其他事務未提交的資料;不可重複讀是指第二次讀時,比第一次讀資料被刪除,第一次查詢結果有改變;幻影讀是指第二次查詢時,查詢結果比第一次更多,但是第一次查詢的結果集沒有發生改變。
9.read commited隔離級別
oracle為每一條查詢語句提供一致性的查詢結果,不需要人工干預。
例如update語句中的where字句查詢,也是可以提供一致性查詢結果的,只是該隱式查詢並不能看到自己的修改,只能看到隱式查詢之前發生的修改。
如果在select列表中含有函式(如count(),sum(),自定義函式),則 函式中的每一條SQL都將在語句級實現一致性,而不是在父select語句級保持一致性,函式內的每一條SQL語句在執行時,”一致性讀快照“都已經建立。也就是說,select列表裡的函式的執行過程中,會讀取其他事務提交的改變。例如,某select列表含有10個函式,均對一張表進行操作,事務總共執行時間為1小時,在這一小時中若有其他使用者對該表進行了修改並提交,則後面的函式(例如最後一個函式)則將讀到其他使用者修改後的資料。
10.提交讀事務中的寫衝突
當一個事務A嘗試去修改某未提交事務B所修改的資料塊,則發生了寫衝突,A事務會等待B事務結束(回滾或提交)釋放相應鎖後,再繼續執行。這裡有兩種情況:第一,當B事務回滾了,則A事務繼續處理之前被鎖定的行資料,就像B事務從來沒有發生過一樣;第二,當B事務提交了,則A事務繼續執行其之前想要處理的行記錄。
11.序列化隔離級別
序列化隔離級別下,事務只能看到事務開始時間的已提交改變和事務自己看到的改變。序列化事務彷彿沒有其他事務在對資料庫進行修改。
序列化事務使用的場景:第一,事務較短且處理的記錄數較少;第二,倆事務同時處理相同記錄的機率較低;第三,執行時間相對較長的事務主要都是隻讀事務。
序列化事務只會處理事務開始時,已經提交的資料,當序列化事務處理其他未提交事務修改的資料時,會報錯。“ORA-08177: Cannot serialize access for this transaction“
12.只讀隔離級別
只讀隔離級別類似於序列化隔離級別,只是只讀隔離級別不會修改資料(SYS使用者除外);
只讀事務主要用於要求報表內容資料必須和開始報表時間保持一致的場景。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30167136/viewspace-1584449/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料併發性和一致性——資料庫概念資料庫
- Oracle的資料併發與一致性詳解(上)Oracle
- PHP 併發扣款,保證資料一致性(悲觀鎖)PHP
- 高併發架構系列:Redis快取和MySQL資料一致性方案詳解架構Redis快取MySql
- Kubernetes 併發控制與資料一致性的實現原理
- Kubernetes併發控制與資料一致性的實現原理
- 高併發下的資料一致性保障(圖文全面總結)
- 資料一致性
- JVM 併發性: Java 和 Scala 併發性基礎JVMJava
- Redis和資料庫的資料一致性問題Redis資料庫
- Redis和MySQL如何保持資料一致性?RedisMySql
- 資料一致性(一) - 介面呼叫一致性
- MySQL資料一致性MySql
- 如何保證MySQL和Redis資料一致性?MySqlRedis
- MySQL隔離級別解析:資料一致性與高併發之間的平衡術!MySql
- 如何保證mongodb和資料庫雙寫資料一致性?MongoDB資料庫
- Redis與資料庫資料一致性Redis資料庫
- 談談資料一致性
- 淺析資料一致性
- mysql資料一致性解析MySql
- [Redis] 02-快取和資料庫資料一致性問題Redis快取資料庫
- 什麼是備份資料庫?什麼是資料庫一致性備份和非一致性備份?資料庫
- mysql:使用樂觀鎖保護資料一致性和完整性MySql
- 資料庫一致性備份資料庫
- 8張圖搞懂Redis和MySQL資料一致性問題RedisMySql
- 資料庫和快取的一致性如何保證資料庫快取
- 如何保證快取和資料庫的一致性?快取資料庫
- 資源供給:併發性控制和mutex之一Mutex
- 資源供給:併發性控制和mutex之二Mutex
- 資源供給:併發性控制和mutex之三Mutex
- 【大廠面試01期】高併發場景下,如何保證快取與資料庫一致性?面試快取資料庫
- 深入理解高併發下的MySQL與Redis快取一致性問題(增刪改查資料快取的一致性、Canal、分散式系統CAP定理、BASE理論、強、弱一致性、順序、線性、因果、最終一致性)MySqlRedis快取分散式
- 轉:Oracle資料庫一致性讀的原理(Consistent Read)Oracle資料庫
- 資料庫事務,原子性、一致性、隔離性、永續性資料庫
- 從實戰出發,聊聊快取資料庫一致性快取資料庫
- 趣說 | 資料庫和快取如何保證一致性?資料庫快取
- gh-ost核心原理:資料一致性和cut-over
- Redis的主從資料一致性Redis