1. 程式人生 > >資料庫事務併發產生的問題以及事務的隔離級別

資料庫事務併發產生的問題以及事務的隔離級別

之前我們談到過,資料庫通過調整事務之間的隔離級別來提高事務的效能。
那麼接下來,我們來首先說說事務之間可能互相遇到的問題。

大家都知道事務只有提交後,才會真正的持久化到硬碟,倘若出現出現了回滾的操作,則事務所有操作的影響都會被回退掉。那麼假若事務在執行過程中,其他事務讀取到了當前的操作結果,但是當前事務後邊回滾了,那麼其他事務相當於讀取到了錯誤的資料。
舉個例子
老闆告訴HR,技術員工從下個月開始漲工資。技術小A從小道訊息得知後,非常開心,準備把自己的單車換成摩托。後邊老闆發現公司的債務堆積嚴重,告知HR取消該加薪計劃。得知真相的小A眼淚流下淚,只能含著淚去找摩托店老闆退貨。
流程如下圖:

理論上小A等員工不應該從側面提前獲知公司的加薪計劃,而應該在公司正式發文後(事務提交後)才可獲知。這個問題就是我們常說的髒讀。此時的隔離級別我們稱之為讀未提交,也就是說還沒有正式公佈的資料,可以被提前獲知到。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )

如何解決這個問題呢?
公司特別進行了申明,任何未經公司正式發文的訊息,全部為不實訊息,大家不可以信賴,出現任何問題後果自負,大家只能相信眼見為實的那些訊息。這種隔離級別我們稱之為讀已提交,也就是隻能讀到公司正式發文的資訊,對於那些未通過正式發文的訊息,直接無視掉。
問題好像已經解決了。
年會前公司正式發文,由於今年業績成長明顯,經討論, 全員加薪。
小A看了看自己騎了兩年的單車,決定換一輛摩托。正所謂搏一搏單車變摩托。
於是小A興沖沖的跑到摩托車行,預定了自己中意已久的摩托。
然而接下來小A在參加年會的過程中,老總在會議上特別宣佈,由於上一年公司業績的特別突出,經過公司董事會的宣佈,包括小A在內的所有員工,特別增發配股。
小A看了看微信已經給摩托車老闆轉發的定金,又看了看最新的路虎,陷入的沉思。正所謂賭一賭摩托變路虎,年會結束後,小A火速聯絡摩托車老闆,一哭二鬧的總算把押金退了,去隔壁的4S店下單了路虎。
流程如下圖:

對於這種每次讀取到待遇都不一樣,導致處理過程中出現了錯誤的處理的場景,我們稱之為不可重複讀。啥意思呢?也就是說即使公司正式發文後(提交後),也可能存在不確定性,因為公司可能反覆提交資料,導致你拿到的資料仍然是髒資料,甚至你已經根據歷史資料進行了錯誤的處理。此時的隔離級別我們稱之為讀已提交。
那麼怎麼解決這個不可重複讀的問題呢?
也就是你操作期間,其他人不能改資料。很簡單,你用什麼資料鎖住什麼資料就好了,如果你需要根據薪酬要做出消費的判斷,那麼只要鎖住薪酬就好了。

這樣好像問題已經解決了,但是通過一系列操作預訂完路虎的你,回家發現,當初私房錢買的比特幣,現在已經漲到3萬美金了,摺合下來資產都過億了。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )望著一串你的小屏手機都快顯示不下的數字,你再次陷入沉思。從沉思緩過來後,你撥通了路虎店的電話,又是一頓一哭二鬧三上吊,你去了旁邊的瑪莎拉蒂店下了訂單。
整體的流程如下:


為啥明明已經鎖定了薪酬,可是收入卻仍然無情的增長。
原因很簡單,你只鎖定住了既有的資料,來自單位的薪酬,沒有鎖住外界新增的資料,導致讀到的資料仍然不夠準確,無法做出正確的處理。這種異常場景我們稱之為幻讀,也就是因為新增資料導致的讀不一致性。而當前的這種隔離級別稱之為可重複讀。也就是我們可以反覆的讀取之前已經讀取到的資料,但是新增的資料,我們仍然可能會讀取到,讀不一致性仍然存在
如何解決幻讀的問題呢?
答案很簡單,還是加鎖,之前加鎖是對某些已經存在的資料加鎖,現在加鎖,是對全域性加鎖,誰要操作,誰獲取到全域性的鎖。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )至此也就不存在併發場景了,也就更不存在併發問題了。這種隔離級別我們稱之為序列化。
至於這幾種隔離級別在innodb中是如何實現的,確實是比較複雜,一兩句話難以說清,我會在後文中專門講解
下邊我們總結一下前文所提到的概念:
1、 髒讀
讀到了其他事務未提交的資料。(也就是髒頁中的資料,這個後文中我會專門講解)
2、 不可重複讀
在事務中每次讀取到的資料是別人已經提交的資料,但是由於存在併發修改(update delele),每次讀取到的資料不一致
3、 幻讀
對於新插入的資料造成的讀不一致性,我們稱之為幻讀
這三個問題都屬於存在併發事務時,資料的前後讀不一致的問題。解決辦法就是通過資料庫的不同隔離機制,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )來規避掉這些問題。
1、 讀未提交 Read Uncommitted
事務未提交的資料修改,對其他事務也是可見的
未解決髒讀,不可重複讀,幻讀
2、 讀已提交 Read Committed
一個事務開始後,只能看到已經提交的事務做出的修改
解決髒讀,未解決不可重複讀,幻讀
3、 可重複讀 Repeatable Read
一個事務開始後,對於已經查詢出的資料,再次反覆查詢獲取到的資料是一樣的
解決了髒讀,不可重複讀,未解決幻讀
這裡要特別注意下,可重複讀級別儘管不要求解決幻讀問題,但是innodb儲存引擎卻不存在該問題,這個我會再接下來的部落格中專門解釋該問題
4、 序列化  Serializable
最高級別,強制事務進行序列操作
解決了所有資料庫併發問題

相關推薦

資料庫事務併發產生的問題以及事務隔離級別

之前我們談到過,資料庫通過調整事務之間的隔離級別來提高事務的效能。那麼接下來,我們來首先說說事務之間可能互相遇到的問題。 大家都知道事務只有提交後,才會真正的持久化到硬碟,倘若出現出現了回滾的操作,則事務所有操作的影響都會被回退掉。那麼假若事務在執行過程中,其他事務讀取到了當前的操作結果,但是當前事務後邊回滾

資料庫的四大特性以及事務隔離級別,七種傳播行為

資料庫的四大特性: 1.原子性 2.一致性 3.隔離性 4.永續性 其中不考慮事務的隔離性會出現下面幾種情況: (1)髒讀 在一個事務處理過程裡讀取了另一個未提交的事務中的資料。 當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併

資料庫事務的四大特性、隔離級別以及Spring中如何利用AOP進行事務管理

首先,什麼是事務? 事務就是業務上的一個邏輯單元,它能夠保證其中對資料所有的操作,要麼成功,要麼失敗。 其次,事務的特性有哪些? 1.原子性。 例如,轉賬,A賬戶減少,B賬戶增加。雖然是兩條 DML語句,但是被當做是一個整體,一次事務。兩條語句只能同時成功或者同時失敗。 2

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

資料庫事務的四大特性以及事務的隔離級別   本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。 如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)   原子性是指事務包含的所有操

資料庫事務ACID和四個隔離級別

在實際的業務場景中,併發讀寫引出了和事務控制的需求。優秀的事務處理能力是關係型資料庫(特別是oracle等商用RDBMS)相對於正當風口的NoSQL資料庫的一大亮點。但這也從另一方面說明了事務控制的複雜性——正因為過於複雜,大部分NoSQL都沒提供事務支援或只提供部分事務支援

spring 中常用的兩種事務配置方式以及事務的傳播性、隔離級別

在前面的文章中總結了spring事務的5中配置方式,但是很多方式都不用而且當時的配置使用的所有引數都是預設的引數,這篇文章就看常用的兩種事務配置方式並資訊配置事務的傳播性、隔離級別、以及超時等問題,廢話不說下面就來看看! 一、註解式事務 1、註解式事務在平時的開發中使用的挺

事務的介紹以及事務隔離級別

什麼是事務 在資料庫操作中,一項事務(Transaction) 是由一條或多條操作資料庫的SQL語句組成的一個不可分割的工作單元。當事務中的所有操作都正常完成時,整個事務才能被提交到資料庫中,如果有一項操作沒有完成,則整個事務會被回滾。 其實事務總結起來理解

Mysql事務以及四中隔離級別例項2以及InnoDB如何解決當時讀的幻讀問題

第二種情況: 也就是基於上一種情況 事務A在事務B插入資料之前沒有進行select 沒有建立一個當前時間點的快照, 所以事務A ,在事務B 插入資料並提交後 再進行查詢操作就會出現幻讀 InnoDB通過Nextkey lock解決了當前讀時的

資料庫事務的四大特性與隔離級別及測試

四大特性 ⑴ 原子性(Atomicity)   原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。 ⑵ 一

事務有哪些特性?spring的事務管理有幾種方式實現,如何實現?spring 中常用的兩種事務配置方式以及事務的傳播性、隔離級別

事務有哪些特性?             1.原子性:一個事務中所有對資料庫的操作是一個不可分割的操作序列,要麼全做要麼全不做            2.一致性:資料不會因為事務的執行而遭到破壞            3.隔離性:一個事物的執行,不受其他事務的干擾,即併發執

網絡協議 finally{ return問題 註入問題 jdbc註冊驅動問題 PreparedStatement 連接池目的 1.2.1DBCP連接池 C3P0連接池 MYSQL兩種方式進行實物管理 JDBC事務 DBUtils事務 ThreadLocal 事務特性 並發訪問 隔離級別

ID -- 1.7 ner red style 沒有 建立 工具 1.1.1 API詳解:註冊驅動 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用 原因有2個: >導致驅動被註冊2次。 &

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

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

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

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

淺析事務的傳播行為與隔離級別

七個傳播行為,四個隔離級別。 Spring中事務的定義:Propagation(key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。)有以下選項可供使用: PROPAGATION_REQUIRED–支援當前事務,如果當前沒有事務,就

Spring事務的傳播特性和隔離級別(持續更新中)

Spring TransactionDefinition介面中定義了事務的隔離級別和事務的傳播特性 傳播特性 例子: class ClassA{ method(){ //邏輯處理1 classB.

spring事務管理(一) 隔離級別、傳播行為

1.事務的定義 事務是指多個操作單元組成的合集,多個單元操作是整體不可分割的,要麼都操作不成功,要麼都成功。其必須遵循四個原則(ACID)。 原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全不做; 一致性(Consistency

spring的4種事務特性、4種隔離級別、7種傳播行為

1.事務概念事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。2.事務特性(4種)事務特性分為四個:原子性(Atomi

Spring事務的傳播行為、隔離級別、回滾、只讀和過期

事務的傳播性- 當事務的方法被另一個事務的方法呼叫時,必須指定事務應該如何傳播。如:方法可能繼續在現有的事務中執行,也可能開啟一個新的事務,並在自己的事務中執行。- 事務的傳播行為可以由傳播屬性指定。Spring定義了7種傳播行為:required:如果有事務在執行,當前的方

spring的4種事務特性,5種隔離級別,7種傳播行為

spring事務: 什麼是事務: 事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗. 事務特性(4種): 原子性 (atomicity):強調事務的不可分割. 一致

Spring的四種事務特性,五種隔離級別,七種傳播行為

Spring事務:什麼是事務:事務邏輯上的一組對資料對操作,組成這些操作的各個邏輯單元,要麼一起成功,要麼一起失敗。事務特性(4種):原子性(atomicity):強調事務的不可分割;一致性(consistency):事務的執行前後資料的完整性保持一致;隔離性(isolati