1. 程式人生 > >資料庫中 事務的四大特性(ACID),事務的隔離級別。

資料庫中 事務的四大特性(ACID),事務的隔離級別。

如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性:

⑴ 原子性(Atomicity)

  原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾

     因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

⑵ 一致性(Consistency)

  一致性是指事務必須使資料庫從一個一致性狀態   變換到   另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

  拿轉賬來說,假設使用者A和使用者B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。

⑶ 隔離性(Isolation)

  隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。

  關於事務的隔離性資料庫提供了多種隔離級別,稍後會介紹到。

⑷ 永續性(Durability)

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

  例如我們在使用JDBC操作資料庫時,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。

----------------------------------------------------------------------------------------------------------------------  

  以上介紹完事務的四大特性(簡稱ACID),現在重點來說明下  事務的隔離性

, 當多個執行緒都開啟事務操作資料庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性。

如果【不考慮事務的隔離性】,會發生的幾種問題:

1,髒讀

  髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。

  當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。例如:使用者A向用戶B轉賬100元,對應SQL命令如下

    update account set money=money+100 where name=’B’;  (此時A通知B)

    update account set money=money - 100 where name=’A’;

  當只執行第一條SQL時,A通知B檢視賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次檢視賬戶時就會發現錢其實並沒有轉。

2,不可重複讀

  不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。

  例如事務T1在讀取某一資料,而事務T2立馬修改了這個資料並且提交事務給資料庫,事務T1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。

  不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另一個事務未提交的髒資料,而不可重複讀則是讀取了前一事務提交的資料。

  在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個資料當然以最後查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如對於同一個資料A和B依次查詢就可能不同,A和B就可能打起來了……

3,虛讀(幻讀)

  幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改  為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

    【幻讀】和【不可重複讀】都是讀取了另一條已經提交的事務(這點只有髒讀不同)。

    【不可重複讀】查詢的都是【同一個資料項】(ps:delete 或update  同一個資料項),

                        而【幻讀】針對的是一批資料整體(比如資料的個數)。(ps:insert操作)

現在來看看MySQL資料庫為我們提供的四種隔離級別:

  ① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

  ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

  ③ Read committed (讀已提交):可避免髒讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

  以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀)。

   在MySQL資料庫中,支援上面四種隔離級別,預設的為Repeatable read (可重複讀);

      而在Oracle資料庫中,只支援Serializable (序列化)級別和Read committed (讀已提交)這兩種級別,其中預設的為Read committed級別。

  在MySQL資料庫中檢視當前事務的隔離級別:

    select @@tx_isolation;

  在MySQL資料庫中設定事務的隔離 級別:

    set  [glogal | session]  transaction isolation level 隔離級別名稱;

    set tx_isolation=’隔離級別名稱;’

例1:檢視當前事務的隔離級別:

  

例2:將事務的隔離級別設定為Read uncommitted級別:

  

或:

  

記住:設定資料庫的隔離級別一定要是在開啟事務之前!

    ----------------------------------------------------------------------------------------------------------------------  


  如果是使用JDBC對資料庫的事務設定隔離級別的話,也應該是在呼叫Connection物件的setAutoCommit(false)方法之前。

     呼叫Connection物件的setTransactionIsolation(level)即可設定當前連結的隔離級別。

     至於引數level,可以使用Connection物件的欄位:

  

在JDBC中設定隔離級別的部分程式碼:

  

  後記:隔離級別的設定只對當前【連結】有效

      對於使用MySQL命令視窗而言,一個視窗就相當於一個【連結】,當前視窗設定的隔離級別只對當前視窗中的事務有效;對於JDBC操作資料庫來說,一個Connection物件相當於一個連結,而對於Connection物件設定的隔離級別只對該Connection物件有效,與其他連結Connection物件無關。

參考部落格:

相關推薦

資料庫 事務四大特性ACID事務隔離級別

如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)   原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾      因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影

事務管理四大特性ACID以及隔離級別和傳播行為

(1)原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。 (2)一致性(Consistency) 一致性是指

資料庫事務四大特性ACID事務隔離級別

事務具有4大特性,一般稱為事務的ACID屬性: 原子性: 事務是一個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行,在操作失敗後不能對資料庫中的資料有任何影響。 一致性: 在事務開始和完成時,資料必須保持一致狀態,這意味著所有相關的資料規則都必須應用於事務

資料庫事務特性ACID

I.事務的4大特性(ACID) 原子性(Atomicity):原子性是指事務是一個不可分割的工作單位,事務中的操作要麼全部成功,要麼全部失敗。 一致性(Consistency):事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。 隔離性(Isol

oracle事務的四個特性ACID

失敗 會話 狀態 服務 可能 ccf 保持 16px 其他 事務產生的背景 當在PL/SQL中同時操作多個SQL語句,比如通過DML語句添加、修改或刪除數據時,如何確保數據庫數據不會因為意外而倒置錯誤數據是一個非常重要的問題。 以倉庫發料系統為例,如果某一張領料單已經領

C++的繼承特性1

1.何為繼承 首先,繼承是什麼?繼承可以簡單理解為孩子繼承了父母雙親的基因,在擁有父母某些特性的同時,又有自己獨立的特性。 在C++中,繼承是類與類之間的繼承,即某個類可以繼承它類的成員變數、成員函

mysql 事物的4大特性ACID+事物的開啟與關閉

原子性: 即整個事物是一個整體,要麼這個事物全部執行成功,要麼全部失敗一致性: 即事物執行狀態結果 與 原資料形成統一。例如轉賬,總金額是不變的隔離性: 在併發事物中,隔離開不能互相影響,但是也不能完全隔離,會降低效率永續性:如果執行成功,資料庫崩潰,如果重新啟動,資料庫已經

數據庫事務

日誌文件 是把 還需要 解決 也不能 實現 損壞 可見 哪些 為什麽需要事務呢? 在數據庫(二),數據庫起源裏面我們提到了事務。 數據庫除了對查詢等操作進行了抽象,另外一個重要的功能就是事務了。為什麽需要事務呢?因為我們在操作數據的時候,可能遇到多個線程同時操作數據的問題,

事務學習總結2——spring事務

一、spring事務:       spring針對事務的解決方案,在基礎的隔離性基礎上,又增加了事務傳播行為、只讀事務、事務超時的機制。 二、事務傳播:       其實就是兩個事務傳播。     &n

Spring 事務學習筆記1事務的基本知識

一、事務&&JDBC事務支援 在我的之前的spring操作資料庫中的文章很少提及事務,不是說它不重要,而是太重要,以至於spring專門有一部分來說明這一內容。之前可以說對事務幾乎沒有考慮過,只是知道把要進行的操作被事務包裹起來,就像在hibernate中進

JSON 的毫秒時間 LONG 轉換成年月日

下面只有程式碼,很簡單的: package com.tujia.ecd.test; import java.util.Date; import java.util.GregorianCalendar; import net.sf.json.JSONObject; p

python下的PandasDataFrame基本操作基本函式整理

pandas作者Wes McKinney 在【PYTHON FOR DATA ANALYSIS】中對pandas的方方面面都有了一個權威簡明的入門級的介紹,但在實際使用過程中,我發現書中的內容還只是冰山一角。談到pandas資料的行更新、表合併等操作,一般用到的

資料庫事務四大特性事務隔離級別在mysql的具體體現

事務的四大特性 原子性 指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 一致性 指事務必須使資料庫從一個一致性狀態轉換到另一個一致性狀態。拿轉賬來說,不管如何轉賬,錢的總數不變。 隔離性 指多個使用者訪問資料庫時,使用者為每個資

Mysql事務詳解事務的概念四大特性使用和回滾

以往的時候在java中,下面一個語句就可以操作一條資料庫語句<span style="font-family: Arial, Helvetica, sans-serif;">Class.forName("com.mysql.jdbc.Driver");//載入相

資料庫事務四大特性————ACID

ACID-----A:Atomicity -原子性     C:Consistency -一致性     I:Isolation -隔離性    D:Durability - 永續性事務:事物(transaction)是由一些列操作序列構成的執行單元,這些單元要麼都做,要麼不

資料庫事務四大特性ACID

事務的4大特性(ACID): 原子性(Atomicity): 事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。 一致性(Consistemcy): 事務前後,資料庫的

資料庫事務的四個基本性質ACID

資料庫事務概念 什麼是資料庫事務? 事務(transaction)是由指邏輯上對資料的的一組操作, 這組操作要麼一次全部成功,如果這組操作全部失敗,是不可分割的一個工作單位。 資料庫事務的四個基本性質(ACID) 1. 原子性(Atomicity) 事務的原子性

數據庫事務四大特性ACID

enc 系統 不出 需要 整數 數據 情況下 iso 應該 一、概念   數據庫事務中的四大特性(ACID):   A:原子性(Atomicity),一個事務(transaction)中的所有操作,要麽全部完成,要麽全部不完成,不會結束在中間某個環節。     事務在

MySQL存儲過程定義特性characteristic的含義

自己 mysql存儲 備註 但是 無法 sql 對象 許可 遇到 MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的默認值來創建存儲過程 通常在使用圖形界面工具進

Python的“四大才子”字符串、列表、字典、集合

不可 inf nbsp 創建 重新 指向 分享圖片 table 數據類型 前戲:在python中把數據序列分為可變(mutable)和不可變(immutable)兩種 不可變:string、int、float、tuple 特點