事物的四大特性(acid)

若是一個數據庫聲稱支持事務的操做,那麼該數據庫必需要具有如下四個特性:mysql

⑴ 原子性(Atomicity)

  原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,這和前面兩篇博客介紹事務的功能是同樣的概念,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。sql

⑵ 一致性(Consistency)

  一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態數據庫

  拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。session

⑶ 隔離性(Isolation)

  隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。併發

  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。oracle

  關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到。spa

⑷ 持久性(Durability)

  持久性是指一個事務一旦被提交了或者回滾後,存儲到數據庫 再也不改變,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。code

  例如咱們在使用JDBC操做數據庫時,在提交事務方法後,提示用戶事務操做完成,當咱們程序執行完成直到看到提示後,就能夠認定事務以及正確提交,即便這時候數據庫出現了問題,也必需要將咱們的事務徹底執行完成,不然就會形成咱們看到提示事務處理完畢,可是數據庫由於故障而沒有執行事務的重大錯誤。blog

 


 

若是不考慮隔離性,則會出現:

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,不可重複讀

         在同一個事務中 兩次的查詢結果不同(update)

    例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據而且提交事務給數據庫,事務T1再次讀取該數據就獲得了不一樣的結果,發送了不可重複讀。

  不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另外一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據。

  在某些狀況下,不可重複讀並非問題,好比咱們屢次查詢某個數據固然以最後查詢獲得的結果爲主。但在另外一些狀況下就有可能發生問題,例如對於同一個數據A和B依次查詢就可能不一樣,A和B就可能打起來了……

3,虛讀(幻讀)

      在同一個事務中 兩次的查詢結果不同(insert 狀況很差演示)

幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中全部的行的某個數據項作了從「1」修改成「2」的操做,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值仍是爲「1」而且提交給數據庫。而操做事務T1的用戶若是再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺同樣,這就是發生了幻讀。

  幻讀和不可重複讀都是讀取了另外一條已經提交的事務(這點就髒讀不一樣),所不一樣的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據總體(好比數據的個數)。


 

 


MySQL查看及設置數據庫的隔離級別:

1,查看

select @@tx_isolation

 

 

2.設置

<1> set  [glogal | session]  transaction isolation level 隔離級別名稱;

<2> set tx_isolation=’隔離級別名稱;

3.數據庫的隔離級別

1)read uncommitted : 讀取還沒有提交的數據 :哪一個問題都不能解決
2)read committed:讀取已經提交的數據 :能夠解決髒讀 ---- oracle默認的隔離級別
3)repeatable read:重讀讀取:能夠解決髒讀 和 不可重複讀 ---mysql默認的隔離級別
4)serializable:串行化:能夠解決 髒讀 不可重複讀 和 虛讀---至關於鎖表

相關文章
相關標籤/搜索