天天看點

Spring事務管理--(一)資料庫事務隔離級别與mysql引擎基礎講解一、前言二、事務隔離級别四個級别與四種現象的關系是:首先盡收眼底!!!三、mysql資料庫引擎

本篇文章來自網絡整理,很簡單,但是很實用對于初級和中級工程師。

原創位址2:http://singo107.iteye.com/blog/1175084

原創位址3:http://www.jb51.net/article/38004.htm

英文

中文

更新丢失

髒讀

不可重複讀

幻讀

Read Uncommited 

讀未送出

不會出現

會出現

Read Commited

讀已送出

Repeatable Read

可重複讀

Serializable

串行化

spring隔離級别

對應資料庫隔離級别

 ISOLATION_DEFAULT

這是一個PlatfromTransactionManager預設的隔離級别,使用資料庫預設的事務隔離級别.

ISOLATION_READ_UNCOMMITTED

Read Uncommited

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ

ISOLATION_SERIALIZABLE

Read uncommitted 讀未送出

公司發工資了,上司把5000元打到singo的賬号上,但是該事務并未送出,而singo正好去檢視賬戶,發現工資已經到賬,是5000元整,非常高興。可是不幸的是,上司發現發給singo的工資金額不對,是2000元,于是迅速復原了事務,修改金額後,将事務送出,最後singo實際的工資隻有2000元,singo空歡喜一場。

Spring事務管理--(一)資料庫事務隔離級别與mysql引擎基礎講解一、前言二、事務隔離級别四個級别與四種現象的關系是:首先盡收眼底!!!三、mysql資料庫引擎

出現上述情況,即我們所說的髒讀,兩個并發的事務,“事務A:上司給singo發工資”、“事務B:singo查詢工資賬戶”,事務B讀取了事務A尚未送出的資料。

當隔離級别設定為Read uncommitted時,就可能出現髒讀,如何避免髒讀,請看下一個隔離級别。

singo拿着工資卡去消費,系統讀取到卡裡确實有2000元,而此時她的老婆也正好在網上轉賬,把singo工資卡的2000元轉到另一賬戶,并在singo之前送出了事務,當singo扣款時,系統檢查到singo的工資卡已經沒有錢,扣款失敗,singo十分納悶,明明卡裡有錢,為何......

出現上述情況,即我們所說的不可重複讀,兩個并發的事務,“事務A:singo消費”、“事務B:singo的老婆網上轉賬”,事務A事先讀取了資料,事務B緊接了更新了資料,并送出了事務,而事務A再次讀取該資料時,資料已經發生了改變。

當隔離級别設定為Read committed時,避免了髒讀,但是可能會造成不可重複讀。

大多數資料庫的預設級别就是Read committed,比如Sql Server , Oracle。如何解決不可重複讀這一問題,請看下一個隔離級别。

當隔離級别設定為Repeatable read時,可以避免不可重複讀。當singo拿着工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),singo的老婆就不可能對該記錄進行修改,也就是singo的老婆不能在此時轉賬。

雖然Repeatable read避免了不可重複讀,但還有可能出現幻讀。

singo的老婆工作在銀行部門,她時常通過銀行内部系統檢視singo的信用卡消費記錄。有一天,她正在查詢到singo當月信用卡的總消費金額(select sum(amount) from transaction where month = 本月)為80元,而singo此時正好在外面胡吃海塞後在收銀台買單,消費1000元,即新增了一條1000元的消費記錄(insert

transaction ... ),并送出了事務,随後singo的老婆将singo當月信用卡消費的明細列印到A4紙上,卻發現消費總額為1080元,singo的老婆很詫異,以為出現了幻覺,幻讀就這樣産生了。

注:Mysql的預設隔離級别就是Repeatable read。

Serializable是最高的事務隔離級别,同時代價也花費最高,性能很低,一般很少使用,在該級别下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

一般現在都用mysql,是以我隻列出mysql的資料引擎一些基礎!!!

MySQL資料庫引擎取決于MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須重新編譯MYSQL。在預設情況下,MYSQL支援三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也常常可以使用。如果技術高超,還可以使用MySQL+API自己做一個引擎。下面介紹幾種資料庫引擎:

    ISAM:ISAM是一個定義明确且曆經時間考驗的資料表格管理方法,它在設計之時就考慮到 資料庫被查詢的次數要遠大于更新的次數。是以,ISAM執行讀取操作的速度很快,而且不占用大量的記憶體和存儲資源。ISAM的兩個主要不足之處在于,它不

支援事務處理,也不能夠容錯:如果你的硬碟崩潰了,那麼資料檔案就無法恢複了。如果你正在把ISAM用在關鍵任務應用程式裡,那就必須經常備份你所有的實 時資料,通過其複制特性,MYSQL能夠支援這樣的備份應用程式。

    MyISAM:MyISAM是MySQL的ISAM擴充格式和預設的資料庫引擎。除了提供ISAM裡所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個并發的讀寫操作,其代價是你需要經常運作OPTIMIZE

TABLE指令,來恢複被更新機制所浪費的空間。MyISAM還有一些有用的擴充,例如用來修複資料庫檔案的MyISAMCHK工具和用來恢複浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操作,這可能就是為什麼MySQL受到了WEB開發如此青睐的主要原因:在WEB開發中你所進行的大量資料操作都是讀取操作。是以,大多數虛拟主機提供商和INTERNET平台提供商隻允許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞後恢複資料。

    HEAP:HEAP允許隻駐留在記憶體裡的臨時表格。駐留在記憶體裡讓HEAP要比ISAM和MYISAM都快,但是它所管理的資料是不穩定的,而且如果在關機之前沒有進行儲存,那麼所有的資料都會丢失。在資料行被删除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表達式來選擇和操控資料的時候非常有用。要記住,在用完表格之後就删除表格。

    InnoDB:InnoDB資料庫引擎都是造就MySQL靈活性的技術的直接産品,這項技術就是MYSQL+API。在使用MYSQL的時候,你所面對的每一個挑戰幾乎都源于ISAM和MyISAM資料庫引擎不支援事務處理(transaction

process)也不支援外來鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支援,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者 或者兩者,那你就要被迫使用後兩個引擎中的一個了。

MyISAM與InnoDB的差別

  InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差别為:MyISAM類型不支援事務處理等進階處理,而InnoDB類型支援。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支援,而InnoDB提供事務支援已經外部鍵等進階資料庫功能。