Oracle面試寶典-事務篇
Oracle 面試寶典 - 事務篇
請介紹下Oracle 事務的概念?
資料庫管理系統提供了事務處理的機制以確保資料的完整性和一致性。
事務的使用是資料庫管理系統與檔案系統最重要的區別之一。
事務是包含一個或多個SQL 語句的邏輯原子工作單元。
事務對SQL 語句進行分組,使它們要麼全部提交 ( 這意味著它們被應用到資料庫 ) ,要麼全部回滾 ( 這意味著它們從資料庫撤消 ) 。只要有一條 SQL 語句執行失敗,則已執行的 SQL 語句會回滾到執行之前的狀態,這樣就保證了資料庫資料的一致性,不至於產生混亂的資料。
所有Oracle 事務都遵循資料庫事務的基本屬性,即 ACID 屬性。 ACID 是以下內容的縮寫 :
•原子性 Atomicity
事務必須是原子工作單元,對其進行的資料修改,要麼全都執行,要麼全都不執行。
強調事務的不可分割 。
例如: 銀行轉賬, A 向 B 轉賬 1000 元, 要在A 賬戶上 減少 1000 元,同時要在 B 賬戶上 增加 1000 元。 並且記錄一條轉賬記錄。 要麼同時執行,要麼都不執行更改,以確保整個事務是一個原子工作單元。
•一致性 Consistency
事務將資料庫從一個一致狀態轉移到另一個一致狀態。
強調事務執行前後, 資料庫的完整性保持一致 。
例如, 銀行轉賬,A 向 B 賬號轉賬 1000 元,是不允許看到 A 的賬號減少 1000 , B 的賬號還沒來得及增加 1000 的中間狀態。
•隔離 性 Isolation
一個事務不會看到另外一個還未完成的事務產生的結果。每個事務就像在單獨、隔離的環境下執行一樣。
強調事務併發訪問 , 一個事務的執行 , 不應該受到另一個事務的打擾 。
例如,一個使用者正在更新 員工 表。其他使用者 不會看到 對 員工表 所做的未提交更改。因此,在使用者看來,事務似乎是序列執行的。
• 持久 性 Durability
提交的事務所做的更改是永久性的。 不會因為系統失敗而丟失。
強調事務結束 , 資料永久儲存資料庫中 。
事務完成後,資料庫透過其恢復機制確保事務中的更改不會丟失。
請介紹下事務有哪幾種隔離級別,有什麼區別?
SQL 標準定義的四個隔離級別為: Read Uncommitted ( 未提交讀 ) 、 Read Committed (提交讀)、 Repeatable Read (可重複讀)、 Serializable (可序列化)
隔離級別主要是為了防止三種現象發生: 髒讀(Dirty Read), 不可重複讀 (Nonrepeatable Read), 幻讀 (Phantom Read)
髒讀:
一個事務讀取了另一個事務修改了但尚未提交的資料。
例如銀行轉賬,A 向 B 轉了 1000 塊錢,發生三步, A 賬號減少 1000 元, B 賬號增加 1000 元,記錄轉賬資訊。如果在剛完成第一步時, B 進行了髒讀,發現自己已經多了 1000 元錢,但是之後 A 又執行了回退操作,這時 B 會發現多的 1000 沒了。實際上轉賬並沒有成功,在這種場景下髒讀也不應該發生。
不可重複讀 :
一個事務, 讀到了另一個事務的提交資料(update ) , 導致查詢結果不一致 。
在同一個事物中,同一個查詢,例如select sal from hrtab where hid='chenjuchao', 在 9:00 時刻查詢發現我的工資是 10000 ,在 9:05 時再次執行相同的查詢,發現我的工資變成了 30000( 可能是另一個事務對我的工資進行了更改,並提交了更改 ) ,
這樣在同一個事物內,不同時間點執行同一個查詢條件返回不一樣的結果的現象,稱為不可重複讀。通常情況下,不可重複讀是由於事務併發修改同一條記錄導致的。
幻讀:
一個事務, 讀到了另一個事務的提交資料(insert) , 導致查詢結果不一致 。
同一事務中,當同一查詢多次執行時,由於其他事務 中 插入操作的提交,會導致每次返回不同的結果集。幻讀是事務非獨立執行時發生的一種現象。
例如:在同一個事物內,9 點時刻,執行更新操作 update hrtab set sal=25000 where station='manage' and sal=20000; 將崗位是經理並且工資是 20000 的員工工資更 改 為25000 ,
更新成功後查詢更新結果select * from hrtab where station='manage' and sal=20000; 發現還有一條記錄沒更新,可能的原因是在更新和查詢之間,另一個事務執行了插入操作,
例如 insert into hrtab(sal,station,...) values(20000,'manage',...);
通常情況下,幻讀是由於併發事務增加記錄導致的。
隔離級別可預防的讀現象
Oracle 資料庫提供了 read committed( 預設 ) 和 serializable 隔離級別。
Read Uncommitted ( 未提交讀 )
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果,不能解決髒讀、不可重複讀、幻讀。併發效能最高,實際應用很少。
Read Committed (提交讀)
大多數資料庫系統預設的隔離級別(Oracle 、 SQLServer), 滿足了隔離的簡單定義,即一個事務只能檢視其他事務已經提交的資料,可以解決髒讀問題,不能解決不可重複讀和幻讀。併發性比 read uncommitted 低。
Repeatable Read (可重複讀)
可以確保同一事務,在多次讀取相同條件的資料時,得到相同的結果。可以解決髒讀和不可重複讀問題,不能解決幻讀問題。併發性比 Read Committed 低。
Serializable (可序列化)
最高的隔離級別,透過強制事務排序,強制事務序列執行,使之不能相互衝突,可以解決髒讀、不可重複讀、幻讀問題。但是併發效能最差 。實際情況下通常需要在完美的事務隔離和效能之間做出妥協。
隔離性: read uncommitted < read committed < repeatable read < serializable
併發效率: read uncommitted > read committed > repeatable read > serializable
歡迎關注我的微信公眾號"IT 小 Chen" ,共同學習,共同成長!!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2678039/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle面試寶典-鎖篇Oracle面試
- Oracle 面試寶典-RAC篇Oracle面試
- Oracle 面試寶典-UNDO篇Oracle面試
- Oracle 面試寶典-DG篇Oracle面試
- Oracle面試寶典-等待事件篇Oracle面試事件
- Oracle面試寶典-引數篇Oracle面試
- Oracle面試寶典-程式結構篇Oracle面試
- Oracle面試寶典-記憶體結構篇Oracle面試記憶體
- Redis面試寶典-持久化篇Redis面試持久化
- MySQL面試寶典-檔案篇MySql面試
- 面試寶典面試
- MySQL面試寶典-主從複製篇MySql面試
- Python面試寶典之基礎篇-05Python面試
- iOS跳槽寶典-面試技術基礎篇iOS面試
- Java 面試寶典Java面試
- PHP面試寶典PHP面試
- iOS 面試寶典iOS面試
- C++面試寶典C++面試
- Java面試葵花寶典Java面試
- 大資料面試寶典五大資料面試
- Java面試寶典-2017Java面試
- Web前端面試寶典(最新)Web前端面試
- 新書出版 |《Oracle程式設計師面試筆試寶典》新書Oracle程式設計師面試筆試
- 好程式設計師Java教程之Java面試寶典Java IO篇程式設計師Java面試
- Java面試寶典之開源框架!Java面試框架
- Oracle 資料庫應急寶典(二)_引數檔案篇Oracle資料庫
- android程式設計師面試寶典Android程式設計師面試
- Java面試寶典2010版Java面試
- 2019最新前端面試寶典前端面試
- Java面試寶典之—-java基礎(含答案)Java面試
- Netbackup For Oracle client安裝寶典Oracleclient
- 面試寶典:15道MyBatis 常見面試題彙總及答案MyBatis面試題
- 【JAVA面試資料】程式設計師面試之葵花寶典1Java面試程式設計師
- 【JAVA面試資料】程式設計師面試之葵花寶典2Java面試程式設計師
- Java初中級程式設計師面試題寶典Java程式設計師面試題
- Kubernetes面試題寶典,建議收藏哦!面試題
- 12個程式設計師筆試面試寶典程式設計師筆試面試
- Java面試寶典2010(一.51—83)Java面試