Oracle面試寶典-事務篇

chenoracle發表於2020-03-02

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章