1. 程式人生 > >資料庫的併發一致性問題

資料庫的併發一致性問題

1.修改丟失問題


2.讀髒資料

T1修改了資料,但隨後T1撤銷了修改,T2讀的是髒資料。


3.不可重複讀

T2 讀取一個數據,T1 對該資料做了修改。如果 T2 再次讀取這個資料,此時讀取的結果和和第一次讀取的結果不同。


4.幻影讀

T1 讀取某個範圍的資料,T2 在這個範圍內插入新的資料,T1 再次讀取這個範圍的資料,此時讀取的結果和和第一次讀取的結果不同。


上述四種問題的特點:

丟失修改:T1,T2都進行修改提交

讀髒資料:T1先修改  T2隨後讀取 ,T1再修改。

不可重複度:T2讀 T1修改 T2再讀

幻影讀:T1讀 T2修改 T1再讀

這裡,似乎不可重複讀和幻影讀是一致的,那麼它們的區別是什麼呢?

從控制的角度來講,不可重複讀只需要鎖住滿足條件的記錄,而幻影讀要鎖住滿足條件的及其相近的記錄。所以,避免幻讀,必須鎖住表,避免不可重複讀,只需要鎖住行。

不可重複讀和幻讀最大的區別在於,如何通過鎖的機制來解決它們產生的問題。

可以採用悲觀鎖的機制來處理問題,悲觀鎖大多數情況下依靠資料庫的鎖機制實現,以保證操作最大程度的獨佔性。但隨之而來的就是資料庫效能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。所以出於效能的考慮,成熟的資料庫使用了以樂觀鎖為理論基礎的MVCC(多版本併發控制)來避免上述兩種問題。

樂觀鎖,大多是基於資料版本記錄機制實現的。 

1.SELECT  : 當開始新一個事務時,該事務的版本號肯定會大於當前所有資料行快照的建立版本號。

2.INSERT : 將當前系統版本號作為資料行快照的建立版本號。

3.DELETE : 將當前系統版本號作為資料行快照的刪除版本號。

4.UPDATE : 可以理解為先執行 DELETE 後執行 INSERT。

上述四種問題產生的原因主要是併發不一致的問題導致破壞了事物四大特性——原子性,隔離性,一致性,永續性之一的隔離性。如果不採取措施的話,那麼在併發的環境中,一個事物所做的修改再最終提交前,其他事物對其也是可見的,並且是可修改的。

我們採用併發控制的技術,讓事物的執行結果和某一個序列執行的結果相同,就認為事物滿足隔離性要求。

一個直觀的想法是使用者獲取對併發控制的所有權力,封鎖操作需要使用者自己控制,相當複雜。資料庫管理系統提供了事物的隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題。比如MySQL提供了行級鎖和表級鎖。但是,加鎖的行為不可避免的會帶來開銷,所以需要在所開銷和併發程度上做出權衡。

針對上述4種問題,有以下幾種封鎖型別:

排它鎖:對資料物件 A 加了 排它鎖,就可以對 A 進行讀取和更新。加鎖期間其它事務不能對 A 加任何鎖。

共享鎖:對資料物件 A 加了 共享鎖,可以對 A 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 A 加 共享鎖,但是不能加 排它鎖。

三級封鎖協議

一級封鎖協議:解決修改丟失問題


二級封鎖協議

在一級的基礎上,要求讀取資料 A 時必須加 S 鎖,讀取完馬上釋放 S 鎖。

可以解決讀髒資料問題,因為如果一個事務在對資料 A 進行修改,根據 1 級封鎖協議,會加 X 鎖,那麼就不能再加 S 鎖了,也就是不會讀入資料。

三級封鎖協議

在二級的基礎上,要求讀取資料 A 時必須加 S 鎖,直到事務結束了才能釋放 S 鎖。

可以解決不可重複讀的問題,因為讀 A 時,其它事務不能對 A 加 X 鎖,從而避免了在讀的期間資料發生改變。


相關推薦

資料庫併發一致性的問題

在併發環境下,事務的隔離性很難保證,因此會出現很多併發一致性問題。 使用隔離級別來防止產生的併發一致性問題 1)丟失修改 2) 讀髒資料    3)不可重複讀    &

資料庫併發操作帶來的資料不一致性

事務是併發控制的基本單位,保證事務的ACID特性是事務處理的重要任務,而事務ACID特性可能遭到破壞的原因之一就是多個事務對資料庫的併發操作造成的。 併發操作帶來的資料不一致性重要有丟失修改,不可重複讀,讀“髒”資料。 1.丟失修改 兩個事務T1和T2讀入同一個資料並修改,

資料庫併發一致性問題

1.修改丟失問題2.讀髒資料T1修改了資料,但隨後T1撤銷了修改,T2讀的是髒資料。3.不可重複讀T2 讀取一個數據,T1 對該資料做了修改。如果 T2 再次讀取這個資料,此時讀取的結果和和第一次讀取的結果不同。4.幻影讀T1 讀取某個範圍的資料,T2 在這個範圍內插入新的資

資料庫併發操作的一致性問題

2.2 SQL Server 2000+ADO.NET實現併發控制 2.2.1 併發一致性問題 常見併發併發一致性問題包括:丟失的修改、不可重複讀、讀髒資料、幻影讀(幻影讀在一些資料中往往與不可重複讀歸為一類)。 2.2.1.1 丟失修改 下面我們先來看一個例子,說明併發操作帶來的資料的不一致性問題。 考慮

資料庫併發訪問、事務與鎖、髒讀、不可重複讀、幻讀

資料庫併發訪問、事務與鎖的關係 一、事務 I : 事務的定義: 首先,讓我們瞭解下什麼是事務?事務是作為單個邏輯單元工作執行的一系列操作。可以是一條 sql語句,也可以是多條 sql 語句 ( 這是它的描述性定義&nb

資料庫併發可能存在的問題和資料庫隔離級別

資料庫併發操作存在的異常情況: 1.更新丟失(LostUpdate): A和B事務併發執行,A事務執行更新後,提交;B事務在A事務更新後,B事務結束前也做了對該行資料的更新操作,然後回滾,則兩次更新操作都丟失了。 第一類丟失更新(回滾丟失,Lost update)。 在事務A期間,事務B對資

阿里P8架構師談:分散式資料庫資料一致性的原理、與技術實現方案!

  背景 可用性(Availability)和一致性(Consistency)是分散式系統的基本問題,先有著名的CAP理論定義過分散式環境下二者不可兼得的關係,又有神祕的Paxos協議號稱是史上最簡單的分散式系統一致性演算法並獲得圖靈獎,再有開源產品ZooKeeper實現的Z

解決Android中的SQLite資料庫併發訪問

我曾經寫過一篇很簡短的文章,闡述了執行緒安全的訪問android sqlite資料庫。樣例程式可以在這裡獲取到。 假設你已經有一個自己的SQLiteOpenHelper。 public class DatabaseHelper extends SQLi

資料庫併發事務出現的幾種讀現象

當多個客戶端併發訪問資料庫時,若沒有采取必要的隔離措施,存在以下問題,這些問題分為5類,其中3類資料度問題:髒讀、幻讀、不可重複讀,2類資料更新問題:第一類丟失更新、第二類丟失更新。 髒讀:一個事務讀取到另外一個事務未提交的資料 事務A訪問資料庫並對某個資料進行了修改,但是當修改還未提交到資

資料庫併發問題 封鎖協議 隔離級別

序 此篇部落格是【眼見為實】系列的第一篇部落格,主要從理論上講了資料庫併發可能會出現的問題,解決併發問題的技術——封鎖,封鎖約定的規則——封鎖協議。然後簡單說明了資料庫事務隔離級別和封鎖協議的對應關係。後面的幾篇部落格都是通過親身實踐探究InnoDB引擎在各個隔離級

資料庫併發問題及事物隔離級別問題:髒讀,不可重複讀,幻讀,第一類丟失更新,第二類丟失更新

來源:《spring 4 企業應用開發實戰》 資料庫併發問題:髒讀,不可重複讀,幻讀,第一類丟失更新,第二類丟失更新 一個數據庫,多個客戶端併發訪問資料庫。在資料庫中的相同資料可能被多個事物同時訪問,如果沒有采取必要的隔離措施,就會導致併發問題,破壞資料的完整性。這些問題可以歸結為5類:3類

資料庫併發存在的四種問題描述

1.更新丟失問題 A和B都對資料庫中的某個欄位進行讀寫操作。 A、B首先讀取資料,B讀取資料的時刻是在A寫入資料之前,這個時候B讀取的是A修改之前的資料,A接著對資料進行寫操作,B在A寫入資料後再對資料寫入,這個時候,A對資料的寫入被B的寫入覆蓋掉了。 假設最初

訂單系統開發(仿淘寶和美團網) 之 專案總結(降低資料庫併發量)

原文: 訂單系統開發(仿淘寶和美團網) 之 專案總結(降低資料庫併發量)      繼上一篇"訂單系統開發(仿淘寶和美團網) 之 專案總結(一)",這篇部落格重點想說下訂單系統開發的設計和有待優化改進的問題。                   上圖是訂單系統資料庫設計比較重要的

分散式資料庫資料一致性原理說明與實現

前言 分散式資料庫的資料一致性管理是其最重要的核心技術之一,也是保證分散式資料庫滿足資料庫最基本的ACID特性中的 “一致性”(Consistency)的保障。在分散式技術發展下,資料一致性的解決方法和技術也在不斷的演進,本文就以作者實際研發的分散式資料庫作為案例,介紹分散

redis中快取的資料與資料庫資料一致性的方案

方式1:資料庫儲存資料,redis不persist redis啟動後,從資料庫載入資料 不要求強一致實時性的讀請求,都由redis處理 要求強一致實時性的讀請求,由資料庫處理 寫請求有2種處理方式,由資料庫處理 - 應用先寫道資料庫,然後更新redis - 應用先寫道資料庫

redis中快取的資料與資料庫資料一致性的方案(好)

方式1:資料庫儲存資料,redis不persistredis啟動後,從資料庫載入資料不要求強一致實時性的讀請求,都由redis處理要求強一致實時性的讀請求,由資料庫處理寫請求有2種處理方式,由資料庫處理- 應用先寫道資料庫,然後更新redis- 應用先寫道資料庫,然後其它da

【深度】分散式資料庫資料一致性原理說明與實現

分散式資料庫的資料一致性管理是其最重要的核心技術之一,也是保證分散式資料庫滿足資料庫最基本的 ACID特性中的 “一致性”(Consistency)的保障。在分散式技術發展下,資料一致性的解決方法和技術也在不斷的演進,本文就以作者實際研發的分散式資料庫作為案例,介紹分散式資料庫資料一致性的原理以及實際實現。

併發一致性解決方案

高併發場景有搶紅包,雙十一搶商品等。 如何去處理這些高併發場景呢? 1.從儲存介質考慮:有記憶體快取和磁碟快取,記憶體快取的速度是比磁碟快取要高出幾十倍的,因此可以考慮儲存介質在記憶體上。想象一下如果搶紅包的時候同時有2萬個請求到達伺服器,我相信使用資料庫來

Mysql資料庫併發插入死鎖問題及處理方式

Mysql有很多坑,對Mysql多執行緒支援這塊不是很熟的話就會莫名其妙地發生一些詭異的問題。多執行緒執行緒併發操作時最容易產生死鎖問題。所以很多大資料的操作一般都採用NoSQL資料庫方案來處理,或者讀寫分離,只需要做好冪等設計即可。如何避免資料庫併發1.通過資料庫連線池做分

資料庫 主從一致性檢查和修復

http://blog.csdn.net/dba_waterbin/article/details/43608587 騰訊遊戲資料自愈服務方案簡介 1. 引言 在正式介紹專案背景之前,讓我們先看一組資料:   這是2個灰度的業務,都是Z3伺服器,我們先只從時間成