1. 程式人生 > >髒讀、幻讀和不可重複讀 + 事務隔離級別

髒讀、幻讀和不可重複讀 + 事務隔離級別

1. 髒讀 髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料
 e.g.
        1.Mary的原工資為1000, 財務人員將Mary的工資改為了8000(但未提交事務)
        2.Mary讀取自己的工資 ,發現自己的工資變為了8000,歡天喜地!
        3.而財務發現操作有誤,回滾了事務,Mary的工資又變為了1000
          像這樣,Mary記取的工資數8000是一個髒資料。

2. 不可重複讀 :是指在一個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也訪問該同一資料。那麼,在第一個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀


    e.g.
    1.在事務1中,Mary 讀取了自己的工資為1000,操作並沒有完成
    2.在事務2中,這時財務人員修改了Mary的工資為2000,並提交了事務.
    3.在事務1中,Mary 再次讀取自己的工資時,工資變為了2000

 解決辦法:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。

3. 幻讀 : 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣


   e.g. 
   目前工資為1000的員工有10人。
   1.事務1,讀取所有工資為1000的員工。
   2.這時事務2向employee表插入了一條員工記錄,工資也為1000
   3.事務1再次讀取所有工資為1000的員工 共讀取到了11條記錄, 
 
 解決辦法:如果在操作事務完成資料處理之前,任何其他事務都不可以新增新資料,則可避免該問題

不可重複讀的重點是修改 :
 同樣的條件, 你讀取過的資料,再次讀取出來發現值不一樣了
幻讀的重點在於新增或者刪除
 同樣的條件, 第 1 次和第 2 次讀出來的記錄數不一樣

 2、在一個程式中,依據事務的隔離級別將會有三種情況發生。
  
  ◆髒讀:一個事務會讀進還沒有被另一個事務提交的資料,所以你會看到一些最後被另一個事務回滾掉的資料。

  ◆不可重複讀:一個事務讀進一條記錄,另一個事務更改了這條記錄並提交完畢,這時候第一個事務再次讀這條記錄時,它已經改變了

  ◆ 幻影讀:一個事務用Where子句來檢索一個表的資料,另一個事務插入一條新的記錄,並且符合Where條件,這樣,第一個事務用同一個where條件來檢索資料後,就會多出一條記錄

3、資料庫提供了四種事務隔離級別, 不同的隔離級別採用不同的鎖類開來實現. 
在四種隔離級別中, Serializable的級別最高, Read Uncommited級別最低. 
大多數資料庫的預設隔離級別為: Read Commited,如Sql Server , Oracle. 
少數資料庫預設的隔離級別為Repeatable Read, 如MySQL InnoDB儲存引擎

SQL SERVER鎖的機制 
   SQL server的所有活動都會產生鎖。鎖定的單元越小,就越能越能提高併發處理能力,但是管理鎖的開銷越大。如何找到平衡點,使併發性和效能都可接受是SQL Server的難點。
SQL Server有如下幾種瑣:
   SQL server的所有活動都會產生鎖。鎖定的單元越小,就越能越能提高併發處理能力,但是管理鎖的開銷越大。如何找到平衡點,使併發性和效能都可接受是SQL Server的難點。


SQL Server有如下幾種瑣:

1、 共享鎖
用於只讀操作(SELECT),鎖定共享的資源。共享鎖不會阻止其他使用者讀,但是阻止其他的使用者寫和修改。

2、 更新鎖
更新鎖是一種意圖鎖,當一個事務已經請求共享瑣後並試圖請求一個獨佔鎖的時候發生更新瑣例如當兩個事務在幾行資料行上都使用了共享鎖,並同時試圖獲取獨佔鎖以執行更新操作時,就發生了死鎖:都在等待對方釋放共享鎖而實現獨佔鎖。更新鎖的目的是隻讓一個事務獲得更新鎖,防止這種情況的發生。

3、 獨佔鎖
一次只能有一個獨佔鎖用在一個資源上,並且阻止其他所有的鎖包括共享縮。寫是獨佔鎖,可以有效的防止’髒讀’。

4、 意圖縮
在使用共享鎖和獨佔鎖之前,使用意圖鎖。從表的層次上檢視意圖鎖,以判斷事務能否獲得共享鎖和獨佔鎖,提高了系統的效能,不需從頁或者行上檢查。

5、 計劃鎖
Sch-M,Sch-S。對資料庫結構改變時用Sch-M,對查詢進行編譯時用Sch-S。這兩種鎖不會阻塞任何事務鎖,包括獨佔鎖。
讀是共享鎖,寫是排他鎖,先讀後更新的操作是更新鎖,更新鎖成功並且改變了資料時更新鎖升級到排他鎖

l     DEFAULT 使用資料庫設定的隔離級別 ( 預設 ) ,由 DBA 預設的設定來決定隔離級別 . 
l     READ_UNCOMMITTED 會出現髒讀、不可重複讀、幻讀 ( 隔離級別最低,併發效能高 ) 
l     READ_COMMITTED  會出現不可重複讀、幻讀問題(鎖定正在讀取的行) 
l     REPEATABLE_READ 會出幻讀(鎖定所讀取的所有行) 
l     SERIALIZABLE 保證所有的情況不會發生(鎖表



 

ReadCommitted: 
假設A事務對正在讀取資料Data放置了共享鎖,那麼Data不能被其它事務改寫,所以當B事務對Data進行讀取時總和A讀取的Data資料是一致的,所以避免了髒讀。由於在A沒有提交之前可以對Data進行改寫,那麼B讀取到的某個值可能會在其讀取後被A更改從而導致了該值不能被重複取得;或者當B再次用相同的where字句時得到了和前一次不一樣資料的結果集,也就是幻像資料。

ReadUncommitted:
假設A事務即不釋出共享鎖,也不接受獨佔鎖,那麼併發的B或者其它事務可以改寫A事務讀取的資料,那麼併發的C事務讀取到的資料的狀態和A的或者B的資料都可能不一致,那麼。髒讀、不可重複讀、幻象資料都可能存在。

RepeatableRead:
(注意MSDN原文中的第一句話:在查詢中使用的所有資料上放置鎖,所以不存在髒讀的情況)。
假設A事務對讀取的所有資料Data放置了鎖,以阻止其它事務對Data的更改,在A沒有提交之前,新的併發事務讀取到的資料如果存在於Data中,那麼該資料的狀態和A事務中的資料是一致的,從而避免了不可重複的讀取。但在A事務沒有結束之前,B事務可以插入新記錄到Data所在的表中,那麼其它事務再次用相同的where字句查詢時,得到的結果數可能上一次的不一致,也就是幻像資料。

Serializable:
 在資料表上放置了排他鎖,以防止在事務完成之前由其他使用者更新行或向資料集中插入行,這是最嚴格的鎖。它防止了髒讀、不可重複讀取和幻象資料。

相關推薦

不可重複 + 事務隔離級別

1. 髒讀 :髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。  e.g.         1.Mary的原工資為1000, 財務人員將Mary的工資改為了8000(但未提交事務

同步非同步阻塞不可重複

1、同步和非同步的概念理解   同步和非同步通常用來形容一次方法呼叫。同步方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為。非同步方法呼叫更像一個訊息傳遞,一旦開始,方法呼叫就會立即返回,呼叫者就可以繼續後續的操作,而且非同步方法通常會在另外一個執行緒中,“

不可重複的個人理解區分

幻讀和不可重複讀常常讓人感到疑惑和難以區分。以下,是個人對幻讀和不可重複讀的一些理解和區分。 首先兩者官方概念如下, 不可重複讀(non-repeatable read):在一個事務內,多次讀同一個資料。在這個事務還沒有結束時,另一個事務也訪問該同一資料。那

.NET:不可重複測試

背景 昨天才發現如果一條資料被A事務修改但是未提交,B事務如果採用“讀已提交”或更嚴格的隔離級別讀取改資料,會導致鎖等待,考慮到資料庫預設的隔離級別是“讀已提交”,在巢狀事務 + 子事務中有複雜的SQL查詢,很可能會出現死鎖,後面會給出巢狀事務導致死鎖的示例。 先來看看:髒讀、不可重複讀和幻讀。 髒讀

資料庫併發訪問事務與鎖不可重複

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

資料庫事務隔離級別-- 不可重複(清晰解釋)

一、資料庫事務隔離級別 資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 √: 可能出

不可重複的簡單理解

首先看看“髒讀”,看到“髒”這個字,我就想到了噁心、骯髒。資料怎麼可能髒呢?其實也就是我們經常說的“垃圾資料”了。比如說,有兩個事務,它們在併發執行(也就是競爭)。看看以下這個表格,您一定會明白我在說什麼: 餘額應該為 1100 元才對!請看 T6 時間點,事務 A

資料庫的不可重複

一、引言 “讀現象” 是在多個事務併發執行時,在讀取資料方面可能碰到的狀況。瞭解它們有助於理解各隔離級別的含義,其中包括髒讀、不可重複讀和幻讀。 二、事務的隔離級別 我們知道,在資料庫中,事務是要滿足ACID的四個性質,即要滿足原子性、一致性、永續性以及隔離性。 在資料庫

不可重複 and 樂觀鎖悲觀鎖 and 事務五種隔離級別

一、髒讀、不可重複讀、幻讀 1、髒讀:髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。 例如:   張三的工資為5000,事務A中把他的工資改為8000,但事務A尚未提

資料庫事務隔離級別-- 不可重複

一 、資料庫事務隔離級別 從高到低: 序列化    serilizable      消耗資源比較嚴重 重複讀    repeatable read    Oracle 預設的事務隔離級別 讀提交    read committed    Mysql 預設的隔離級別

資料庫併發事務存在的問題(不可重複等)

一個數據庫可能擁有多個訪問客戶端,這些客戶端併發訪問資料庫時,若沒有采取必要的隔離措施,存在以下問題,這些問題分為5類,包括3類資料讀問題:髒讀、不可重複讀和幻讀。兩類資料更新問題:第一類丟失更新、第二類丟失更新。 1.髒讀 A事務讀取B事務尚未提交的更

SQL Server 中的事務事務隔離級別以及如何理解, 未提交,不可重複產生的過程原因

原本打算寫有關 SSIS Package 中的事務控制過程的,但是發現很多基本的概念還是需要有 SQL Server 事務和事務的隔離級別做基礎鋪墊。所以花了點時間,把 SQL Server 資料庫中的事務概念,ACID 原則,事務中常見的問題,問題造成的原因和事務隔離級別等這些方面的知識好好的整理了一下。

資料庫問題原因詳解(不可重複

一、髒讀、不可重複讀、幻讀 1、髒讀:髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。 例如: 張三的

資料庫事務隔離級別不可重複

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable  ,後面三個可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 髒讀 不可重複讀 幻讀 Read u

資料庫事務隔離級別不可重複的理解

一、資料庫事務正確執行的四個基本要素 1.1ACID原則。   ACID原則是資料庫事務正常執行的四個基本要素,分別指原子性、一致性、獨立性及永續性。   原子性(Atomicity)是指一個事務要麼全部執行,要麼不執行,也就是說一個事務不可能只執

不可重複

發生事務併發的情況下。髒讀——一個事務讀取到了另一個事務未提交的資料。幻讀——一個事務(A)修改了表中的所有資料行,另一個事務(B)新增了一行 資料,前一個事務(A)提交後檢視資料,發現還有一條未修改

通俗地解釋不可重複

spring(資料庫)事務隔離級別分為四種(級別遞減): 1、Serializable (序列化):最嚴格的級別,事務序列執行,資源消耗最大; 2、REPEATABLE READ(重複讀) :保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的資料。

不可重複 共享鎖悲觀鎖 事務五種隔離級別

一、髒讀、不可重複讀、幻讀 1、髒讀:髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。 例如:   張三的工資為5000,事務A中把他的工資改為8000,但事務A尚未提交。   與

事務特性及不可重複(虛

事務是指邏輯上的一組操作,這組操作要麼全部成功,要麼全部失敗。事務的特性(ACID):原子性(A):事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性(C):事務前後資料的完整性

資料庫事務隔離不可重複

一、資料庫事務隔離級別 資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。