一、數據的四大特徵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後面甚至不用臨時表了。