1. 程式人生 > >資料庫事務解析及事務四個特性

資料庫事務解析及事務四個特性



   1.資料併發的問題 
    一個數據庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有采取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為5類,包括3類資料讀問題(髒讀、幻象讀和不可重複讀)以及2類資料更新問題(第一類丟失更新和第二類丟失更新)。下面,我們分別通過例項講解引發問題的場景。

髒讀(dirty read) 
    在講解髒讀前,我們先講一個笑話:一個有結巴的人在飲料店櫃檯前轉悠,老闆很熱情地迎上來:“喝一瓶?”,結巴連忙說:“我…喝…喝…”,老闆麻利地開啟易拉罐遞給結巴,結巴終於憋出了他的那句話:“我…喝…喝…喝不起啊!”。在這個笑話中,飲料店老闆就對結巴進行了髒讀。 
A事務讀取B事務尚未提交的更改資料,並在這個資料的基礎上操作。如果恰巧B事務回滾,那麼A事務讀到的資料根本是不被承認的。來看取款事務和轉賬事務併發時引發的髒讀場景:
     

時間 轉賬事務A 取款事務B
T1 開始事務
T2 開始事務
T3 查詢賬戶餘額為1000元
T4 取出500元把餘額改為500元
T5 查詢賬戶餘額為500元(髒讀)
T6 撤銷事務餘額恢復為1000元
T7 匯入100元把餘額改為600元
T8 提交事務

  在這個場景中,B希望取款500元而後又撤銷了動作,而A往相同的賬戶中轉賬100元,就因為A事務讀取了B事務尚未提交的資料,因而造成賬戶白白丟失了500元。

不可重複讀(unrepeatable read) 
   不可重複讀是指A事務讀取了B事務已經提交的更改資料。假設A在取款事務的過程中,B往該賬戶轉賬100元,A兩次讀取賬戶的餘額發生不一致:

時間 取款事務A 轉賬事務B
T1 開始事務
T2 開始事務
T3 查詢賬戶餘額為1000元
T4 查詢賬戶餘額為1000元
T5 取出100元把餘額改為900元
T6 提交事務
T7 查詢賬戶餘額為900元(和T4讀取的不一致)

   在同一事務中,T4時間點和T7時間點讀取賬戶存款餘額不一樣。
幻象讀(phantom read) 
    A事務讀取B事務提交的新增資料,這時A事務將出現幻象讀的問題。幻象讀一般發生在計算統計資料的事務中,舉一個例子,假設銀行系統在同一個事務中,兩次統計存款賬戶的總金額,在兩次統計過程中,剛好新增了一個存款賬戶,並存入100元,這時,兩次統計的總金額將不一致:  

時間 統計金額事務A 轉賬事務B
T1 開始事務
T2 開始事務
T3 統計總存款數為10000元
T4 新增一個存款賬戶,存款為100元
T5 提交事務
T6 再次統計總存款數為10100元(幻象讀)

  如果新增資料剛好滿足事務的查詢條件,這個新資料就進入了事務的視野,因而產生了兩個統計不一致的情況。 
  幻象讀和不可重複讀是兩個容易混淆的概念,前者是指讀到了其它已經提交事務的新增資料,而後者是指讀到了已經提交事務的更改資料(更改或刪除),為了避免這兩種情況,採取的對策是不同的,防止讀取到更改資料,只需要對操作的資料新增行級鎖,阻止操作中的資料發生變化,而防止讀取到新增資料,則往往需要新增表級鎖——將整個表鎖定,防止新增資料。

第一類丟失更新 
    A事務撤銷時,把已經提交的B事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來: 
    

時間 取款事務A 轉賬事務B
T1 開始事務
T2 開始事務
T3 查詢賬戶餘額為1000元
T4 查詢賬戶餘額為1000元
T5 匯入100元把餘額改為1100元
T6 提交事務
T7 取出100元把餘額改為900元
T8 撤銷事務
T9 餘額恢復為1000元(丟失更新)


  A事務在撤銷時,“不小心”將B事務已經轉入賬戶的金額給抹去了。 
第二類丟失更新 
  A事務覆蓋B事務已經提交的資料,造成B事務所做操作丟失:  

時間 轉賬事務A 取款事務B
T1 開始事務
T2 開始事務
T3 查詢賬戶餘額為1000元
T4 查詢賬戶餘額為1000元
T5 取出100元把餘額改為900元
T6 提交事務
T7 匯入100元
T8 提交事務
T9 把餘額改為1100元(丟失更新)


    上面的例子裡由於支票轉賬事務覆蓋了取款事務對存款餘額所做的更新,導致銀行最後損失了100元,相反如果轉賬事務先提交,那麼使用者賬戶將損失100元

    2.事務四大特性

一.什麼是事務
事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
二.事務的 ACID
事務具有四個特徵:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱為 ACID 特性。
1 、原子性
事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2 、一致性
事 務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統 執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性
一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指一個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

資料庫系統必須維護事務的以下特性 ( 簡稱 ACID) :

原子性 (Atomicity)

一致性 (Consistency)

隔離性 (Isolation)

永續性 (Durability)

原子性 (Atomicity)

事務中的所有操作要麼全部執行,要麼都不執行;

如果事務沒有原子性的保證,那麼在發生系統

故障的情況下,資料庫就有可能處於不一致狀

態。

相關推薦

資料庫事務解析事務特性

    1.資料併發的問題      一個數據庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有采取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為5類,包括3類資料讀問題(髒讀、幻

數據庫事務特性含義

數據 操作 cit ability 沒有 tom tran 必須 rollback 數據庫事務transanction正確執行的四個基本要素。 ACID 原子性(Atomicity) 原子性:整個事務中的所有操作,要麽全部完成,要麽全部不完成,不可能停滯在中間某個環節。事務

資料庫事務特性

一.什麼是事務 事務是應用程式中一系列邏輯相關的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性:一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提

資料庫事務以及事務特性

如果你是一名後臺程式設計師開發,那麼你一定或多或少的接觸過事務。因為相對於高併發,且業務有一定複雜性的系統來說,事務是一定需要的,而且是必須的。他可以幫助我們將若干不同的子任務當成一個整體來完成,以保證整個業務的正確性。舉個簡單的例子:在七夕這天,你給你的女票發了一個520紅包對於錢款轉移的這個過程來說,存在

事務是什麽,以及事務特性

mce 數據庫系統 之間 沒有 數據 不執行 spa 其中 acid 事務是什麽,以及事務四個特性 一.什麽是事務 事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麽全部成

事務特性,以及在並發環境下可能引發的一些問題

每次 技術 如同 讀取 pda com 屬性 發的 刪除 原子性 整個事務中的所有操作,要麽全部完成,要麽全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 一致性

mysql的事務特性以及事務隔離級別

故障 sdn 相加 否則 transacti 工資 spa 發現 高並發 一、事務四大屬性 分別是原子性、一致性、隔離性、持久性。 1、原子性(Atomicity) 原子性是指事務包含的所有操作要麽全部成功,要麽全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,

關於mysql的事務特性

背景知識: mysql事務支援的引擎是InnoDB mysql事務的四個特性(ACID),分別是原子性,一致性,隔離性,永續性 1.原子性:事務開啟(start transaction)到事務結束(commit / rollback)之間的語句要麼全部執行成功,要麼全部執行失

什麼是事務,事務特性是什麼

    最近在學習pgSQL,忽然想到一個問題,pgSQL的事務是否和其他事務一樣呢?由此就有了這篇小結。首先什麼是事務?事務(Transaction)是併發控制單位,是使用者定義的一個操作序列,這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。事務通常以BEGIN T

事務事務特性

  現實生活中,我們往往經常會進行轉賬操作,轉賬操作可以分為兩部分來完成,轉入和轉出。只有這兩部分都完成了才可以認為是轉賬成功。在資料庫中,這個過程是使用兩條語句來完成的,如果其中任意一條語句出現了異常沒有執行,則會導致兩個賬號的金額不同步,造成錯誤。  為了防止上面可能出現的情況,MySQL引入了事務,所謂

事務是什麼,以及事務特性

一.什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到

ACID——MYSQL事務特性

ACID指出每個事務型RDBMS必須遵守四個屬性,即原子性、一致性、孤立性、永續性。 原子性 原子性意味著事務的整體性和不可分割性,這就類似化學中的原子,是一個不可分割的單元。一個事務可以是一

什麼是事務事務特性是什麼?有哪些隔離級別?

1)       事務(Transaction):是資料庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作;這些操作作為一個整體一起向系統提交,要麼都執行、要麼都不執行;事務是一組不可再分割的操作集合(工作邏輯單元); 2)       事務具有4個屬性,通常稱為

事務是什麼?以及事務特性

一.什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務

oracle事務特性(ACID)

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

資料庫三大正規化事務隔離級別

原文連結:https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html https://www.cnblogs.com/huanongying/p/7021555.html 在實際開發中最為常見的設計正規化有三個: 1.第一正規化(確保

MySQL資料庫簡單操作事務和索引

分享MySQL資料庫簡單操作及事務和索引的筆記,希望對大家有所幫助。 MySQL資料庫操作:[[email protected] ~]# mysql -u root -p //進入資料庫中 mysql> show databases; //檢視所有資料庫 mysql> use my

java學習之面向對象的特性

修改 行為 per 具體化 建立 編譯器 版本 自動 fin 對象:由行為、狀態和唯一標誌組成。 一 抽象 抽象是忽略一個主題中與當前目標無關的方面,把現實世界中的概念轉換為對象,可以是表示數據的VO對象或抽象類,也可以是表示一類行為的接口。有利於從眾多變化的狀態中抽

轉載《Spring AOP中pointcut expression表達式解析 匹配多條件》

targe 組合 man fin rgs acc ans value account 原文地址:https://www.cnblogs.com/rainy-shurun/p/5195439.html 原文 Pointcut 是指那些方法需要被執行"AOP",是由"Poi

C++解析(21):操作符

0.目錄 1.邏輯操作符的陷阱 2.逗號操作符的分析 3.前置操作符和後置操作符 4.小結 1.邏輯操作符的陷阱 邏輯運算子的原生語義: 運算元只有兩種值(true和false) 邏輯表示式不用完全計算就能確定最終值 最終結果只能是true或者false 示例——短路法則: #include