本篇講訴數據庫中事務的四大特性(ACID),而且將會詳細地說明事務的隔離級數據庫
別。併發
若是一個數據庫聲稱支持事務的操做,那麼該數據庫必需要具有如下四個特性:事務
⑴ 原子性(Atomicity) ci
原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,這和前面兩博客
篇博客介紹事務的功能是同樣的概念,所以事務的操做若是成功就必需要徹底應用到it
數據庫,若是操做失敗則不能對數據庫有任何影響。io
⑵ 一致性(Consistency) date
一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就數據
是說一個事務執行以前和執行以後都必須處於一致性狀態。查詢
拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之
間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就
是事務的一致性。
⑶ 隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個
用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2
要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不
到有其餘事務在併發地執行。
關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到。
⑷ 持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性
的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。
1,髒讀
髒讀是指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。
當一個事務正在屢次修改某個數據,而在這個事務中這屢次的修改都還未提交,
這時一個併發的事務來訪問該數據,就會形成兩個事務獲得的數據不一致。例如:用
戶A向用戶B轉帳100元,對應SQL命令以下update account set money=money+100 where name=’B’; (此時A通知
B)
update account set money=money - 100 where name=’A’;
當只執行第一條SQL時,A通知B查看帳戶,B發現確實錢已到帳(此時即發生了
髒讀),而以後不管第二條SQL是否執行,只要該事務不提交,則全部操做都將回
滾,那麼當B之後再次查看帳戶時就會發現錢其實並無轉。
2,不可重複讀
不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了
不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。
例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據而且提交事務給數
據庫,事務T1再次讀取該數據就獲得了不一樣的結果,發送了不可重複讀。
不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另外一個事務未提交的髒數
據,而不可重複讀則是讀取了前一事務提交的數據。
在某些狀況下,不可重複讀並非問題,好比咱們屢次查詢某個數據固然以最後
查詢獲得的結果爲主。但在另外一些狀況下就有可能發生問題,例如對於同一個數據A
和B依次查詢就可能不一樣,A和B就可能打起來了……
3,虛讀(幻讀)
幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中全部的行的某
個數據項作了從「1」修改成「2」的操做,這時事務T2又對這個表中插入了一行數據項,
而這個數據項的數值仍是爲「1」而且提交給數據庫。而操做事務T1的用戶若是再查看
剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像
產生幻覺同樣,這就是發生了幻讀。
幻讀和不可重複讀都是讀取了另外一條已經提交的事務(這點就髒讀不一樣),所不
同的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據總體(好比數
據的個數)。