數據庫提高篇

一、數據的四大特徵ACID

1.1 原子性(Atomicity):事務是數據庫的邏輯工作單位,它對數據庫的修改要麼全部執行,要麼全部不執行。用事務實現。

1.2 一致性(Consistemcy):事務執行前後,數據庫的狀態都滿足所有的完整性約束。

1.3 隔離性(Isolation):併發執行的事務之間是隔離的,保證多個事務互不影響。有幾個隔離級別。

1.4 持久性(Durability):一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。

二、數據庫的隔離級別

2.1 讀未提交:一個事務可以讀取到另一個事務未提交的修改。這會帶來髒讀、幻讀、不可重複讀問題。(基本沒用)

2.2 讀已提交:一個事務只能讀取另一個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀和幻讀問題。

2.3 可重複讀:同一個事務中多次讀取相同的數據返回的結果是一樣的。其避免了髒讀和不可重複讀問題,但幻讀依然存在.

2.4 串行化:事務串行執行。避免了以上所有問題。

2.5 名詞解釋:

髒讀(dirty read):一個事務可以讀取另一個尚未提交事務的修改數據. 這個未提交的數據有可能會被回滾(放棄),所以叫髒讀。

非重複讀(nonrepeatable read): 在同一個事務中,同一個查詢在T1時間讀取某一行,在T2時間重新讀取這一行時候,這一行的數據已經發生修改,可能被更新了(update),也可能被刪除了(delete), 前後讀取的不一致可能會對程序邏輯造成影響。 

幻像讀(phantom read):同上, 一個是update, 一個是insert區別。

串行化: 串行執行事務。不存在併發。

參考例子:

https://www.cnblogs.com/kingcat/archive/2013/09/23/3334317.html

三、事務實現原理(mysql)

通過mvcc來實現的。MVCC的全稱是“多版本併發控制”。

在InnoDB中,給每行增加兩個隱藏字段一個用來記錄數據行的創建時間,另一個用來記錄行的過期時間(刪除時間)
3.1 SELECT
讀取創建版本小於或等於當前事務版本號,並且刪除版本爲空或大於當前事務版本號的記錄。這樣可以保證在讀取之前記錄是存在的。
3.2 INSERT
將當前事務的版本號保存至行的創建版本號
3.3 UPDATE
新插入一行,並以當前事務的版本號作爲新行的創建版本號,同時將原記錄行的刪除版本號設置爲當前事務版本號
3.4 DELETE
將當前事務的版本號保存至行的刪除版本號

四、實例

超買:

https://blog.csdn.net/gaoxuaiguoyi/article/details/47304615

五、 編寫複雜sql

5.1 先拆解業務幾個步驟的sql

5.2 合成sql, 把幾個步驟的sql作爲臨時表去合。 一般放在where或者from後面。

5.3 優化sql。 把from後面的一些邏輯可以移動到where後面甚至不用臨時表了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章