本篇文章來自網絡整理,很簡單,但是很實用對于初級和中級工程師。
原創位址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空歡喜一場。

出現上述情況,即我們所說的髒讀,兩個并發的事務,“事務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提供事務支援已經外部鍵等進階資料庫功能。