資料庫事務 隔離性 悲觀鎖和樂觀鎖

2021-09-10 07:28:22 字數 2125 閱讀 7652

原子性(atomicity)

原子性是指事務包含的操作要麼全部內容執行成功,要麼全部內容失敗回滾。

一致性(consistency)

一致性是指事務必須使資料庫乙個一致性狀態變換到另乙個一致性狀態,也就是事務操作執行前和操作執行後保持相同的一致性狀態,最經典的例子就是a跟b轉賬,a和b總數2000,不管相互之間轉了多少次,總數2000是不會變,個人感覺有點像能量守恆定律。

隔離性(isolation)

隔離性是當多個使用者併發訪問資料庫時,如同時運算元據庫同一張表,資料庫為每個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。假如有兩個事務c和d,要麼d在c之前完成,要麼d在c之後開始,這樣的形式才會形成事務的隔離狀態。

read uncommitted

讀取未提交的資訊,有髒讀情況的危險存在

read committed

讀取提交的資訊,有不可重複讀的情況

repeatable read

讀取資料(事務開啟),此時不允許修改資料,有幻讀情況的危險存在

serializable

序列化順序執行,讀取資料時,禁止修改,插入,不存在髒讀、不可重複讀和幻讀的問題,但是這種隔離級別效率低下,比較耗資料庫效能,一般不使用。

永續性(durability)

永續性就是我們乙個事務一旦提交,那麼對資料庫中的資料改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

未提交讀(read uncommitted)

讀取資料時,未加任何鎖:所以事務1在讀取某行資料時,事務2也可以對這行進行讀取、更新操作。

修改資料時,新增了行級共享鎖:所以事務1在修改某行資料時,新增了行級共享鎖,事務2會讀取到事務1修改後,但未提交的資料,並且就不能新增排它寫鎖,所以不能更新這行資料(因此會出現髒讀現象)

提交讀(read committed)

讀取資料時,加行級共享鎖,一旦讀完該行,就會釋放行級共享鎖:事務1在對某行資料進行讀取時,因為是共享鎖,所以事務2也可以讀取這行資料,但是當事務1對某行資料讀取結束之後,事務2立馬就能對這行資料加上排它寫鎖,並對其進行修改操作結束之後,事務1再次讀取這行資料發生變化(因此出現不可重複讀)

修改資料時,加行級排它鎖,直到事務結束才釋放:事務1在修改某行資料時,會先加上排它鎖,直到事務結束,事務2在此期間無法對這行資料進行讀取(解決髒讀問題)

可重複讀(repeatable read)

讀取資料時,加行級共享鎖,直到事務結束:事務1讀取某行資料時,會增加共享鎖,直到事務結束才會釋放,所以事務2在此期間可以對這行資料進行讀取,但不能加排它鎖,因為不能修改這行資料(解決不可重複讀問題)

修改資料時,加行級排它鎖,直到事務結束時釋放:情況和提交讀的修改資料時一樣

注:但無法解決事務1讀取資料集時,事務2往這個表中插入新的資料集(未加表級鎖,出現幻讀問題)

可序列化(serializable)

讀取資料時,加表級共享鎖,直到事務結束時釋放:事務1對錶資料讀取時,事務2也可對錶資料讀取,但無法對錶資料進行更新、修改、插入等操作(解決幻讀)

修改資料時,加表級排它鎖,直到事務結束時釋放:事務1對錶資料讀取時,事務2不可對錶資料讀取,但無法對錶資料進行更新、修改、插入等操作

悲觀鎖含義:1)有強烈的獨佔和排它特性,2)對資料被外界修改持保守態度,3)在整個資料處理過程中,將資料處於鎖定狀態。

關係型資料庫:行鎖、表鎖和讀鎖、寫鎖

樂觀鎖含義:1)每次都認為別人不會修改,所以不會上鎖,2)但是更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。

使用場景:多讀少寫的,這樣可以提高吞吐量

實現:使用版本號,發現衝突,上層應用會不斷的進行retry。

鎖實現往往依靠資料庫提供鎖機制

原因:資料庫才是真正對資料庫訪問具有排它性,應用無法保證外部系統不會修改資料庫。

資料庫悲觀鎖和樂觀鎖簡述

鎖 locking 業務邏輯的實現過程中,往往需要保證資料訪問的排他性。如在金融系統的日終結算 處理中,我們希望針對某個 cut off 時間點的資料進行處理,而不希望在結算進行過程中 可能是幾秒種,也可能是幾個小時 資料再發生變化。此時,我們就需要通過一些機 制來保證這些資料在某個操作過程中不會被...

資料庫的悲觀鎖和樂觀鎖

資料庫的四種隔離級別 髒讀 不可重複讀 可重複讀 序列化,雖然四種隔離級別能夠處理事務問題,但是不夠靈活,於是有了悲觀鎖和樂觀鎖。悲觀鎖 對於外界的修改持保守態度,在整個資料處理中資料處於鎖定狀態。以mysql為例,select for update和lock in share model能夠實現悲...

資料庫的悲觀鎖和樂觀鎖

悲觀鎖就是對資料的衝突持悲觀態度,也就是假設資料肯定會發生衝突,所以在資料開始讀取的時候就把資料鎖定住。書籍表book,id為商品id 主鍵 isonline是否上線,1代表上線,0代表下線,那麼我們如果要對書籍進行下線,就需要將online置為0,假設id為1 如果不採用鎖 1 select fr...