1. 程式人生 > >客觀面試題--11.什麼是事務?事務的特性,隔離級別有哪些?

客觀面試題--11.什麼是事務?事務的特性,隔離級別有哪些?

1.什麼是事務?
就是把多件事情當做一件事情來處理。也就是大家同在一條船上,要活一起活,要over一起over !
例如:在關係資料庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程式。

事務是恢復和併發控制的基本單位
2.事務的特性,隔離級別有哪些?
事務應該具有4個屬性:原子性、一致性、隔離性、持續性。這四個屬性通常稱為ACID特性
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

永續性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
為什麼要使用事務?
我為什麼要使用事務? 俺這裡再舉個很俗很俗的例子:

俺到銀行存錢,於是有這麼幾個步驟:
1、把錢交給工作人員;2、工作人員填單;3、將單子給我簽字;4、工作人員確認並輸入電腦。

要是,要是我把錢交給工作人員之後,進行到3我簽字了。那哥們突然心臟病發作,over掉了,那,我的錢還沒有輸入電腦,但我卻交了錢又簽字確認了,而並沒有其他任何記錄。我豈不是要虧死了???我的血汗錢啊!趕緊退給我!!

於是,在資料庫裡產生了這麼一個術語:事務(Transaction),也就是要麼成功,要麼失敗,並恢復原狀。

隔離級別: 

1,髒讀

  髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。

2,不可重複讀

  不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。

3,虛讀(幻讀)

  幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。

現在來看看MySQL資料庫為我們提供的四種隔離級別:

  ① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

  ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

  ③ Read committed (讀已提交):可避免髒讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀)。

記住:設定資料庫的隔離級別一定要是在開啟事務之前!

Oracle資料庫支援READ COMMITTED 和 SERIALIZABLE這兩種事務隔離級別。所以Oracle不支援髒讀