資料庫三正規化、事務、隔離級別
資料庫三正規化:
1NF:列不可再分(確保每一列的原子性);
2NF:行需要唯一區分(非鍵欄位必須依賴於鍵欄位);
3NF:非主屬性只依賴於主屬性,而不能依賴於其它非主屬性(除了主鍵以外的其它列都不傳遞依賴於主鍵列)。
事務
資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和永續性)屬性。事務是資料庫執行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。
1.原子性(Atomic)(Atomicity)
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
2.一致性(Consistent)(Consistency)
事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。某些維護一致性的責任由應用程式開發人員承擔,他們必須確保應用程式已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程式時,應避免在轉帳過程中任意移動小數點。
3.隔離性(Insulation)(Isolation)
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為隔離性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續執行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程式降低隔離級別以換取更大的吞吐量。
4.永續性(Duration)(Durability)
事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
隔離級別
不考慮事務的隔離性,會發生的幾種問題:髒讀,不可重複讀,幻讀。然後資料庫隔離級別有如下四種:
讀未提交(Read Uncommitted):最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。即可能出現髒讀,不可重複讀,幻讀。
讀提交(Read Committed):只有在事務提交後,其更新結果才會被其他事務看見。可以解決髒讀問題。
可重複讀(Repeated Read):在一個事務中,對於同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀。這是Mysql中預設的隔離級別。
序列化(Serialization):事務序列化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題。
注:
髒讀:是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
不可重複讀:是指一個事務範圍內多次查詢卻返回了不同的資料值,是因為在查詢間隔別其它事務修改並提交了。
幻讀:和不可重複讀都是讀取了另一條已經提交的事務,不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。