數據庫的事務到鎖

最近複習到了數據庫的內容,查了好多資料,覺得都特別抽象,下面內容除了做一些總結,儘可能舉一些自己嘗試的例子。

 

1.事務:

是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼不做,是一個不可分割的單位。

例如:在關係數據庫中,一個事務可以是一條SQL語句,一組SQL語句,或者整個程序。

事務和程序是兩個概念,一般地講,一個程序中包含若干個事務。

事務是恢復和併發控制的基本單位。

 

2.事務具有四個特性,也就是常說的ACID特性:

(1)原子性(Atomicity)

  原子性是指事務包含的所有操作要麼都做,要麼都不做。
(2)一致性(Consistency)

    一個事務執行之前和執行之後數據庫都必須處於一致性狀態。一致性和原子性是密切相關的。或者說數據庫從一個正確的狀態遷移到另一個正確的狀態。
(3)隔離性(Isolation)

    一個事務的執行不能被其他事務干擾。即一個事務的內部操作及使用的數據對其他併發事務來說是隔離的,併發執行的各個事務      之間不能相互干擾。
(4)持久性(dependency)

   一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。一個事務要麼提交,要麼回滾,一旦提交了數據就被改變  了,無法再回滾。

 

3.事務的ACID特性可能遭到破壞的原因之一就是多個事務對數據庫的併發操作造成的。

   爲什麼要併發操作呢?一個個來不行嗎?

   併發是爲了提高對數據庫中數據的利用效率。

最簡單地說就像火車購票系統,如果真的每次只能有一個人對購票系統數據庫進     行訪問等第一個人操作完之後,第二個才進行,那麼全國所有人買票就是一場噩夢。真實情況是,你剛剛打開購票系統,顯示     還有一百張票,再點進去可能發現已經沒有票了,這一秒鐘的猶豫裏面,已經有其他用戶對購票系統進行了購票操作,這就是併發。

  然而併發操作如果不加以控制就會造成一些意想不到的後果,比如說考慮到下面的例子:

1.(事務T1)阿牛讀出火車票餘額A,設A=10;

2.(事務T2)阿斌讀出火車票餘額A,也爲10;

3.阿牛購買一張火車票,修改餘額A--->A-1,所以A=9,把A寫回數據庫。

4.阿斌購買一張火車票,修改餘額A--->A-1,所以A=9,把A寫回數據庫。

結果就是明明賣出了兩張票,數據庫中火車票餘額卻只減少了1.

併發操作會帶來丟失修改、不可重複讀、讀“髒”數據等問題,所以我們需要對併發控制進行管理,即併發控制技術。

鎖就是實現數據庫併發控制的技術

鎖是爲了解決併發控制的一系列問題而引入的。

4.鎖的分類

從程序員角度來說鎖,可以分爲兩類:樂觀鎖和悲觀鎖。

樂觀鎖

樂觀鎖是一種思想,它其實並不是一種真正的『鎖』。它會先嚐試對資源進行修改,在寫回時根據版本號是否改變來判斷資源是否進行了改變,如果沒有發生改變就會寫回,否則就會進行重試,在整個的執行過程中其實都沒有對數據庫進行加鎖。

悲觀鎖

悲觀鎖又具體可以分爲X鎖(獨佔鎖)、S鎖(讀鎖)。

在介紹各種鎖之前,我先提一個問題,就是獨佔鎖、讀鎖、表鎖、頁鎖、行鎖到底是什麼關係?

查閱各種資料的時候,初學者很容易被弄懵圈,我先直接放出結論。

答:

 悲觀鎖(真正的鎖)從類型上可以分爲兩種,共享鎖和獨佔鎖,其實就是對應着讀寫兩個操作。
 從粒度上可以分爲:表鎖(一次鎖定整個表)、頁鎖、行鎖(一次鎖定一行數據)。

所以,表鎖有兩種:共享表鎖、獨佔表鎖。

           頁索有兩種:共享頁索、獨佔頁鎖。

           行鎖有兩種:共享行鎖、獨佔行鎖。

看起來有點簡單,剛剛開始接觸這些知識的時候還是被弄蒙圈了,一堆的鎖,到底什麼關係。

 

5.總結

       事務的(ACID)特性是由關係數據庫管理系統(RDBMS,數據庫系統)來實現的。數據庫管理系統採用日誌來保證事務的原子性、一致性和持久性。日誌記錄了事務對數據庫所做的更新,如果某個事務在執行過程中發生錯誤,就可以根據日誌,撤銷事務對數據庫已做的更新,使數據庫退回到執行事務前的初始狀態。

  數據庫管理系統採用鎖機制來實現事務的隔離性。當多個事務同時更新數據庫中相同的數據時,只允許持有鎖的事務能更新該數據,其他事務必須等待,直到前一個事務釋放了鎖,其他事務纔有機會更新該數據。

 

 

待續......

聚簇索引和非聚簇索引的區別?

 

附上幾篇寫的比較好的博客:

https://blog.csdn.net/suifeng629/article/details/99412917(鎖和隔離級別的關係)

https://blog.csdn.net/cigang/article/details/84794232

https://blog.csdn.net/weixin_39723544/article/details/92646477

https://www.cnblogs.com/zhangfengshi/p/11443773.html

https://segmentfault.com/a/1190000018470235?utm_medium=referral&utm_source=tuicool

https://blog.csdn.net/u014079773/article/details/52808193

https://blog.csdn.net/qq_41026740/article/details/97408858

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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