五分鐘理解數據庫事務引發的安全性問題

       最近面試發現面試官都很容易問關於這方面的問題,所以就稍稍總結了下,希望對正在找工作的小夥伴們有幫助,如何快速的理解並且記住事務引發的安全性問題,從而在面試中取得好的成績。

本文主要分三個模塊來講解。需要重點理解共享鎖/排它鎖鎖的三要素,事務級別和鎖的關係

第一部分:鎖的介紹

1.什麼是樂觀鎖?

       通俗的理解,太樂觀了,總是認爲我們對數據操作時,不會產生衝突問題。也就是說在操作數據時,並不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有衝突了。一般來說數據庫不實現樂觀鎖,需要我們自己去實現。

       樂觀鎖中常見的實現機制:先給數據表加一個版本(version)字段,操作一次,將那條記錄的版本號加1。

2.什麼是悲觀鎖?

       通俗的理解,太悲觀了,總是認爲我們對數據操作時,會產生衝突問題。也就是說每次操作時,都要通過獲取鎖才能進行對相同數據的操作。數據庫本身實現了悲觀鎖。

      有哪些悲觀鎖?

              2.1共享鎖:又稱讀鎖,是讀取操作創建的鎖。其他事務可以併發讀取數據,但是不能對數據進行修改,直到釋放鎖。

                      共享鎖SQL實現機制:SELECT ... LOCK IN SHARE MODE;

             2.2 排它鎖:又稱寫鎖,如果事務T對數據D加上排他鎖後,則其他事務不能再對D加任任何類型的鎖。獲准排他鎖的事務既                               能讀數據,又能寫數據。

                      排他鎖SQL實現機制:SELECT ... FOR UPDATE;

              2.3行鎖:對數據庫中的“讀寫操作的行”加鎖

              2.4表鎖:對數據庫中的“讀取操作的表”加鎖

第二部分:安全性問題

       1.髒讀:事務A正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中。這時,事務B也訪問這個數據,                  然後使用了這個數據。

       2.不可重複讀:在一個事務中,多次讀取數據時,不能讀取到相同的數據內容。事務A讀取數據XXX之後未提交事務,此時                   事務B對數據XXX進行了修改,並且B提交了事務,持久化到數據庫,此時事務A在次讀取XXX數據,發現兩次讀取內                   容不一致。

       幻讀:與不可重複讀的差異:不可重複讀是事務A讀取到了事務B的update行爲,虛讀是事務A讀取到了事務B的insert行爲。

第三部分:數據庫事務的級別

       數據庫的事務級別我們可以理解爲按照鎖來劃分的。主要有3個鎖的要素:鎖的類型、鎖的釋放、鎖的範圍。

      1.鎖的類型:共享鎖、排他鎖。具體介紹看第一部分

      2.鎖的釋放:2.1在操作數據上釋放鎖。對數據的讀寫操作完成後釋放鎖,此時如果操作數據的這個事務尚未結束,其他事務                             是可以繼續操作數據的。

                           2.2在操作數據的事務上釋放鎖。對數據的讀寫操作完成後並未釋放鎖,此時要等操作數據的這個事務結束後,                             其他事務纔可以操作這個數據。

      3.鎖的範圍:3.1對操作的數據上鎖。操作哪一行數據,就對哪一行數據上鎖。

                           3.2對操作的數據的表上鎖。操作那個表的數據,就對那個表上鎖。

       一級事務:未提交讀(Read uncommitted) 

               原理:鎖的類型:讀取共享鎖

                          鎖的釋放:讀取數據結束,釋放鎖

                          鎖的範圍:對讀取的數據上鎖

               引發的安全性:虛讀,不可重複讀,幻讀

               表現:讀取數據未結束時,不釋放鎖,誰都可以讀,但是不能寫;

                          讀取數據結束,釋放鎖,但事務尚未結束的時候,其他事務可以隨意讀寫,因爲此時鎖釋放了,事務卻沒有結                              束,所以什麼安全性問題都可能引發。

       二級事務:已提交讀(Read committed)

           原理:鎖的類型:讀取共享鎖,修改排他鎖

                      鎖的釋放:讀取數據結束,釋放鎖

                                        修改數據的事務結束,釋放鎖

                      鎖的範圍:對操作的數據上鎖

           引發的安全性:不可重複讀,幻讀

           表現:讀取操作和一級事務一致

                      修改數據的事務在沒有結束時,所有的事務都不可以修改,因爲此時排它鎖還未釋放。因此解決了髒讀。

       三級事務:可重複讀(Repeatable read)

           原理:鎖的類型:讀取共享鎖,修改排他鎖

                      鎖的釋放:讀取數據的事務結束,釋放鎖

                                        修改數據的事務結束,釋放鎖

                      鎖的範圍:對操作的數據上鎖

           引發的安全性:幻讀

           表現:讀取數據的事務在沒有結束時,所有的事務都不可以修改數據,因爲此時讀取鎖還未釋放。

                      修改數據的事務在沒有結束時,所有的事務都不可以修改數據,因爲此時排他鎖還未釋放。因此解決了不可重讀

       四級事務:序列化(Serializable)

           原理:鎖的類型:讀取共享鎖,修改排他鎖

                      鎖的釋放:讀取數據的事務結束,釋放鎖

                                        修改數據的事務結束,釋放鎖

                      鎖的範圍:對操作的表上鎖

           引發的安全性:無(至少上述三種安全性)

           表現:這個比較好理解,對錶上鎖了,而且都是讀寫的事務結束以後才釋放鎖,所以要寫的前提是,先拿到鎖。什麼時                        候能拿到鎖?讀寫數據的事務結束以後。所以能解決目前所知的所有安全性問題。但是這樣的話讀寫效率會很低。

       一二三四級事務原理總結,方便記憶,在此基礎上,需要大家充分理解3個鎖的要素:

       如果你已經把我的這個看懂了,我相信以後你只需要看一眼這個表就能回想起來他們的關係了,如果在面試的時候遇到關於鎖的問題,事務的問題,或者髒讀,幻讀等問題。別管什麼,直接一條龍服務。其實我個人理解,把這三個部分串聯起來是最容易理解的。

       

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