事務、事務特性、事務隔離級別 、鎖機制逐層分析

一、事務

事務定義:滿足acid的一到多個SQL組成的一個整體

二、事務特性

1、原子性:一個整體,不可分割。
拿轉賬舉例,A轉給B100元,A-100和B+100是一個整體,不能單獨發生,若是A-100成功,B+100未成功,則整個事務將回滾。
2、一致性:
拿轉賬舉例,A轉給B100元,A-100則B必須+100,不能不加或者+200,否則增加和減少的數據不一致,錢的總數發生了改變。
再例如,刪除一個學生,則學生相關的成績,選課等等和這個學生的相關信息也要一併刪除。
3、獨立性:
獨立性是多個事務之間,形容事物之間彼此的可見性的。
絕對的獨立性是指一個事物未結束,則它的執行過程對其他事務是不可見的。(但是獨立性越高,性能越差,因此實際應用中往往不會使用絕對獨立性
不同的獨立性級別用事務的隔離級別來形容。
4、持久性:
事務一旦提交,則數據庫中必須要做成相應的操作,即使數據庫崩潰,待恢復時,數據庫也要根據日誌完成事務中的一系列操作。

三、事務的隔離級別

事務的隔離級別是用來形容事務之間彼此的可見性的。

1、未提交的讀:
事務還未提交,便可以讀到這個事務的操作流程產生的結果。
例:A轉賬給B100元這個事務還未提交,其他事務就可以查到A-100.
一旦轉賬失敗,事務回滾.則其他事務查到的數據就是髒數據。
結果:產生髒讀
2、提交的讀:
必須等當前事務提交後,其他事務才能讀取這個事物的結果,但是允許其他事務更新數據,當前事務可能會獲得兩次不一樣的結果。
解決:髒讀
結果:產生不可重複讀問題
3、可重複讀:
必須等當前事務提交後,其他事務才能讀取這個事物的結果,但是允許其他事務插入數據,當前事務可能會獲得新增數據。
解決:不可重複讀
結果:產生幻讀問題
4、序列化:
必須等當前事務提交後,其他事務才能讀取這個事物的結果,不允許插入也不允許修改
解決:幻讀
結果:不會產生問題

四、更新丟失

1、定義:如果多個線程操作,基於同一個查詢結構對錶中的記錄進行修改,那麼後修改的記錄將會覆蓋前面修改的記錄,前面的修改就丟失掉了,這就叫做更新丟失。

2、序列化可以防止更新丟失問題的發生。其他的三個隔離級別都有可能發生更新丟失問題。

3、解決:
加樂觀鎖:
樂觀的認爲每一條sql語句都不會出現更新丟失的情況,然後
在表中增加一個version字段,在更新數據庫記錄是將version加一,從而在修改數據時通過檢查版本號是否改變判斷出當前更新基於的查詢是否已經是過時的版本。
如果數據庫中數據的修改比較多,更新失敗的次數會比較多,程序需要多次重複執行更新操作。

五、鎖機制

記錄鎖 – 鎖定某行
間隙鎖 – 鎖定某個區間
臨鍵鎖 – 鎖定左開右閉的一段區間
(各種鎖各司其職,結合一些其他的機制,實現事務的隔離,比較複雜,就不深入理解了)
1、共享鎖:允許多個線程同時獲取一個鎖,一個鎖可以同時被多個線程擁有。
2、排他鎖:一個鎖在某一時刻只能被一個線程佔有,其它線程必須等待鎖被釋放之後纔可能獲取到鎖。

共享鎖【S鎖】
又稱讀鎖,若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

排他鎖【X鎖】
又稱寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

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