天天看點

java 事務_java基礎之MySQL事務和視圖

java 事務_java基礎之MySQL事務和視圖

第三節 事務和視圖

3.1事務

事務是用來維護資料庫完整性的,它能夠保證一系列的MySQL操作要麼全部執行,要麼全不執行。舉一個例子來進行說明,例如轉賬操作:A賬戶要轉賬給B賬戶,那麼A賬戶上減少的錢數和B賬戶上增加的錢數必須一緻,也就是說A賬戶的轉出操作和B賬戶的轉入操作要麼全部執行,要麼全不執行;如果其中一個操作出現異常而沒有執行的話,就會導緻賬戶A和賬戶B的轉入轉出金額不一緻的情況,為而事實上這種情況是不允許發生的,是以為了防止這種情況的發生,需要使用事務處理。

1. 事務的概念

事務(Transaction)指的是一個操作序列,該操作序列中的多個操作要麼都做,要麼都不做,是一個不可分割的工作機關,是資料庫環境中的邏輯工作機關,由DBMS中的事務管理子系統負責事務的處理。

目前常用的存儲引擎有InnoDB(MySQL5.5以後預設的存儲引擎)和MyISAM(MySQL5.5之前預設的存儲引擎),其中InnoDB支援事務處理機制,而MyISAM不支援。

2. 事務的特性

事務處理可以確定除非事務性序列内的所有操作都成功完成,否則不會永久更新面向資料的資源。通過将一組相關操作組合為一個要麼全部成功要麼全部失敗的序列,可以簡化錯誤恢複并使應用程式更加可靠。

但并不是所有的操作序列都可以稱為事務,這是因為一個操作序列要成為事務,必須滿足事務的原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)和持久性(Durability)。這四個特性簡稱為ACID特性。

java 事務_java基礎之MySQL事務和視圖
1) 原子性

原子是自然界最小的顆粒,具有不可再分的特性。事務中的所有操作可以看做一個原子,事務是應用中不可再分的最小的邏輯執行體。

使用事務對資料進行修改的操作序列,要麼全部執行,要麼全不執行。通常,某個事務中的操作都具有共同的目标,并且是互相依賴的。如果資料庫系統隻執行這些操作中的一部分,則可能會破壞事務的總體目标,而原子性消除了系統隻處理部分操作的可能性。

2) 一緻性

一緻性是指事務執行的結果必須使資料庫從一個一緻性狀态,變到另一個一緻性狀态。當資料庫中隻包含事務成功送出的結果時,資料庫處于一緻性狀态。一緻性是通過原子性來保證的。

例如:在轉賬時,隻有保證轉出和轉入的金額一緻才能構成事務。也就是說事務發生前和發生後,資料的總額依然比對。

3) 隔離性

隔離性是指各個事務的執行互不幹擾,任意一個事務的内部操作對其他并發的事務,都是隔離的。也就是說:并發執行的事務之間既不能看到對方的中間狀态,也不能互相影響。

例如:在轉賬時,隻有當A賬戶中的轉出和B賬戶中轉入操作都執行成功後才能看到A賬戶中的金額減少以及B賬戶中的金額增多。并且其他的事務對于轉賬操作的事務是不能産生任何影響的。

4) 持久性

持久性指事務一旦送出,對資料所做的任何改變,都要記錄到永久存儲器中,通常是儲存進實體資料庫,即使資料庫出現故障,送出的資料也應該能夠恢複。但如果是由于外部原因導緻的資料庫故障,如硬碟被損壞,那麼之前送出的資料則有可能會丢失。

【示例8】使用事務保證轉賬安全

-- 
           

3. 事務的并發問題

髒讀(Dirty read)

當一個事務正在通路資料并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時另外一個事務也通路了這個資料,然後使用了這個資料。因為這個資料是還沒有送出的資料,那麼另外一個事務讀到的這個資料是“髒資料”,依據“髒資料”所做的操作可能是不正确的。

java 事務_java基礎之MySQL事務和視圖
不可重複讀

(Unrepeatableread): 指在一個事務内多次讀同一資料。在這個事務還沒有結束時,另一個事務也通路該資料。那麼,在第一個事務中的兩次讀資料之間,由于第二個事務的修改導緻第一個事務兩次讀取的資料可能不太一樣。這就發生了在一個事務内兩次讀到的資料是不一樣的情況,是以稱為不可重複讀。

java 事務_java基礎之MySQL事務和視圖
幻讀

(Phantom read): 幻讀與不可重複讀類似。它發生在一個事務(T1)讀取了幾行資料,接着另一個并發事務(T2)插入了一些資料時。在随後的查詢中,第一個事務(T1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,是以稱為幻讀。

java 事務_java基礎之MySQL事務和視圖
不可重複度和幻讀差別:

不可重複讀的重點是修改,幻讀的重點在于新增或者删除。

解決不可重複讀的問題隻需鎖住滿足條件的行,解決幻讀需要鎖表

例1(同樣的條件, 你讀取過的資料, 再次讀取出來發現值不一樣了 ):事務1中的A先生讀取自己的工資為 1000的操作還沒完成,事務2中的B先生就修改了A的工資為2000,導 緻A再讀自己的工資時工資變為 2000;這就是不可重複讀。

例2(同樣的條件, 第1次和第2次讀出來的記錄數不一樣 ):假某工資單表中工資大于3000的有4人,事務1讀取了所有工資大于3000的人,共查到4條記錄,這時事務2 又插入了一條工資大于3000的記錄,事務1再次讀取時查到的記錄就變為了5條,這樣就導緻了幻讀

4. 事務的隔離級别

事務的隔離級别用于決定如何控制并發使用者讀寫資料的操作。資料庫是允許多使用者并發通路的,如果多個使用者同時開啟事務并對同一資料進行讀寫操作的話,有可能會出現髒讀、不可重複讀和幻讀問題,是以MySQL中提供了四種隔離級别來解決上述問題。

事務的隔離級别從低到高依次為READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ以及SERIALIZABLE,隔離級别越低,越能支援高并發的資料庫操作。

java 事務_java基礎之MySQL事務和視圖

【示例9】事務的隔離級别

-- 
           

3.2 視圖 view

1. 視圖的概念

視圖是一個從單張或多張基礎資料表或其他視圖中建構出來的虛拟表。同基礎表一樣,視圖中也包含了一系列帶有名稱的列和行資料,但是資料庫中隻是存放視圖的定義,也就是動态檢索資料的查詢語句,而并不存放視圖中的資料,這些資料依舊存放于建構視圖的基礎表中,隻有當使用者使用視圖時才去資料庫請求相對應的資料,即視圖中的資料是在引用視圖時動态生成的。是以視圖中的資料依賴于建構視圖的基礎表,如果基本表中的資料發生了變化,視圖中相應的資料也會跟着改變。

2. 視圖的好處

簡化使用者操作

:視圖可以使使用者将注意力集中在所關心地資料上,而不需要關心資料表的結構、與其他表的關聯條件以及查詢條件等。

對機密資料提供安全保護:

有了視圖,就可以在設計資料庫應用系統時,對不同的使用者定義不同的視圖,避免機密資料(如,敏感字段“salary”)出現在不應該看到這些資料的使用者視圖上。這樣視圖就自動提供了對機密資料的安全保護功能

【示例9】視圖練習1

-- 
           

【示例10】視圖練習2

--
           

本節作業

1. 事務的概念和特征

2. 并發問題及其事務的隔離級别

3. 視圖的定義和優點

4. 完成示例9,示例10視圖操作

本知乎号每日更新2篇java基礎視訊貼,以及2-4篇java基礎技術文章,有興趣的同學可以關注學習。

繼續閱讀