mysql資料庫事務詳細剖析

來源:互聯網
上載者:User

標籤:標準   理解   代碼   提交   資料庫表   資料   資料庫事務   永久   應該   

 

 

 

在寫之前交代一下背景吧!

做開發也好久了,沒怎麼整理過知識,現在剖析一下自己對資料庫事務的認識,以前用sqlserver,現在轉java後又用mysql、oracle。我這塊就主要解釋一下mysql資料庫事務。其實好多內容適用於各種標準資料庫!

直接就進入本文了!

不管是做啥都有理論知識,我在這塊也介紹一下。

  • 事務的特性

1.原子性(Atomicity):原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 

2.一致性(Consistency):在一個事務中,事務前後資料的完整性必須保持一致,可以想象銀行轉賬、火車購票。

3.隔離性(Isolation):多個事務,事務的隔離性是指多個使用者並發訪問資料庫時, 一個使用者的事務不能被其它使用者的事務所幹擾,多個並發事務之間資料要相互隔離。

4.持久性(Durability):持久性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

寫這些概念呢,是有點繞!繞就繞吧!反正也不是我規定的,這是官方的,解釋是我編的!!!

  •  事務的並發訪問問題


如果我們在不考慮隔離性問題時,事務是存在三種並發訪問問題的。

1.髒讀:在一個事務中,當讀取資料時,讀到了另一個事務未提交的資料。  

比如A賬戶給B賬戶轉了1塊錢,但是A沒有提交事務,被B賬戶通過髒讀看到了,這時,B就會以為A已經把錢轉過來了,但是這時,A賬戶復原事務。其實錢就沒給B轉過去,但是B自己本身以為A已經轉過去了,,,有點繞,估計是我描述到繞!

看代碼:

update account set money=money+1 where name=’B’;   --此時A去通知Bupdate account set money=money -1 where name=’A’;

  

2.不可重複讀取:在一個事務中,兩次讀取的資料內容不一致,這是因為在查詢時,有時間間隔,資料被另一個事務已經修改提交了,那就會出現問題。

3.幻讀/虛讀:在一個事務中,兩次讀取的資料量不一致。

  • 事務的隔離等級

上面介紹了3種事務並發問題!現在介紹一下資料庫提供的解決方案!

1.read uncommitted : 讀取尚未提交的資料 :這個最低級,但是效率肯定最高,但是哪一個問題都不能解決。

2.read committed:讀取已經提交的資料 :可以解決髒讀  。

3.repeatable read:重讀讀取:可以解決髒讀 和 不可重複讀取 。

4.serializable:序列化:可以解決髒讀不可重複讀取和虛讀,效率最差,相當於鎖表,開發中一般不用。 

上面的“2”是oracle資料庫預設設定,“3”是mysql資料庫預設的設定。

下面呢我就重點解釋一下mysql資料庫在上面各種交易隔離等級上的示範:

首先介紹兩個文法:

1.查看mysql資料庫預設的隔離等級:select @@tx_isolation

2.設定mysql的隔離等級:set session transaction isolation level 事務的隔離等級

  • 事務的隔離等級示範

注意:如果要自己類比要開啟兩個mysql用戶端,也就是類比兩個使用者!

1.read uncommitted

我通過文法將資料庫的交易隔離等級改為了read uncommitted。

首先我有一張account表。 

視窗一

 視窗二

資料庫表未經處理資料money都是5000,當我啟動事務後,在zhangsan賬戶增加了1000和在李四賬戶減去了1000,但是我的事務還未提交,但是我重新查詢資料庫表時,資料已經發生變化,這就是髒讀和不可重複讀取

幻讀/虛讀我就不掩飾了,同樣存在!

2.read committed

 

我將資料庫事務隔離性改為了read committted。

        還是上面那張表:

視窗一

  

 

 

 視窗二

 

 

 

資料庫表zhangsan賬戶的money和lisi賬戶的money都發生了變化,我未提交事務,在另一個視窗事務開啟下查詢時,沒有出現髒讀,但是當我提交事務時,在另一個視窗的事務下重新查詢,出現了不可重複讀取的情況,這樣可以避免髒讀,但是查詢時已經出現不可重複讀取和幻讀/虛讀!

3.repeatable read

我將資料庫事務隔離性改為了read committted。

        還是上面那張表:

視窗一

 視窗二

 我在兩個視窗都開啟了事務,當視窗一進行資料操作後,並進行事務提交,在視窗二的事務開啟情況下,我去查詢,沒有查詢到剛才視窗一的資料操作記錄,這樣就避免了髒讀和不可重複讀取

 有人說也避免了虛讀/幻讀,其實沒有。

 看圖:

我在操作lisi賬戶時,資料只是發生修改的變化,但是當我修改wangwu這個賬戶時,再去查詢出現了wangwu,賬戶的資料,但是其實在我未操作前,wangwu賬戶的資料是查詢不出的。這就是幻讀/虛讀!


如果不理解幻讀/虛讀這塊,可以查一下InnoDB。

4.serializable

我就不示範了,開發不建議用,效率又慢,但是所有的問題都能避免!!

總計一下 

交易隔離等級的效能:

    read uncommitted>read committed>repeatable read>serialazable

交易隔離等級的安全性:

   read uncommitted<read committed<repeatable read<serialazable

mysql的事務控制:

     開啟事務:start transaction;

     提交:commit;

     復原:rollback;

 

mysql資料庫事務詳細剖析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.