在引入事務之前我們先考慮銀行轉賬的操作:
# 從id=1的賬戶給id=2的賬戶轉賬100元
# 第一步:將id=1的a賬戶餘額減去100
update accounts set balance = balance-
100where id =1;
#第二步:將id=2的b賬戶餘額加上100
update accounts set balance = balance +
100where id =
2;
上邊的兩個sql語句必須全部執行,或者由於某種原因第一條語句執行成功而第二條語句執行失敗時,第一條語句必須被撤銷。我們把多條語句作為乙個整體進行操作的功能稱為資料庫事務
。把撤銷指定sql語句的過程稱為回退
。資料庫事務可以保證事務範圍內的所有操作都可以全部成功或者全部失敗。
一般來講事務有acid
四個特性:
對於單條sql語句來說,資料庫系統會自動的將其作為原子工作單元執行,要麼全執行,要麼全部執行,這種事務我們稱之為隱式事務
。
當然我們也可以手動將多條sql語句作為乙個事務來執行,這種事務我們稱之為顯示事務
,其一般格式如下:
#使用begin開啟乙個事務,即試圖把事務內的所有sql所做的修改永久儲存。
begin
;update accounts set balance = balance -
100where id =1;
update accounts set balance = balance +
100where id =2;
#使用commit提交乙個事務
begin
;update accounts set balance = balance -
100where id =1;
update accounts set balance = balance +
100where id =2;
commit
;commit
;
isolation level
髒讀(dirty read)
不可重複讀(non repeatable read)
幻讀(phantom read)
read uncommitted
yesyes
yesread committed
-yes
yesrepeatable read--
yesserializable--
-read uncommitted
是隔離級別最低的一種事務級別。在這種隔離級別下,乙個事務會讀到另乙個事務更新後但未提交的資料,如果另乙個事務回滾,那麼當前事務讀到的資料就是髒資料,這就是髒讀(dirty read)。
在read committed
隔離級別下,乙個事務可能會遇到不可重複讀(non repeatable read)的問題。
不可重複讀
是指,在乙個事務內,多次讀同一資料,在這個事務還沒有結束時,如果另乙個事務恰好修改了這個資料,那麼,在第乙個事務中,兩次讀取的資料就可能不一致。
在repeatable read
隔離級別下,乙個事務可能會遇到幻讀(phantom read)的問題。
幻讀
是指,在乙個事務中,第一次查詢某條記錄,發現沒有,但是,當試圖更新這條不存在的記錄時,竟然能成功,並且,再次讀取同一條記錄,它就神奇地出現了。
serializable
是最嚴格的隔離級別。在serializable隔離級別下,所有事務按照次序依次執行,因此,髒讀、不可重複讀、幻讀都不會出現。
雖然serializable隔離級別下的事務具有最高的安全性,但是,由於事務是序列執行,所以效率會大大下降,應用程式的效能會急劇降低。如果沒有特別重要的情景,一般都不會使用serializable隔離級別。
MySQL之事務詳解
一 用途 二 條件與級別 1.事務基本要素原子性 一致性 隔離性 永續性乙個事務中的所有操作,要麼全部完成,要麼全部不完成 事務在執行過程中發生錯誤,會被回滾到事務開始前的狀態,就像事務從來沒執行過一樣事務開始前和事務完成後,資料庫完整性沒有被破壞 寫入的資料完全符合所有的預設規則資料庫允許多個併發...
MySQL學習之事務
前言 今天學習鎖的時候講到了事務,有些都忘了,所以寫一篇隨筆來複習一下 事務是由一組sql語句組成的邏輯處理單元。事務具有以下4個特性,簡稱為事務acid屬性。acid屬性 含義原子性 atomicity 事務是乙個原子操作單元,其對資料的修改,要麼全部成功,要麼全部失敗。一致性 consisten...
mysql 事務中查詢 mysql之事務
我們為什麼要使用資料庫的事務呢?使用事務有什麼缺點呢?使用原因 保持資料的匹配和一致性。缺點 併發操作中過度使用事務影響效能,因為事務用到了鎖技術。我是李福春,今天我們來複習一下事務的特性。你可以收穫下圖中的知識點。下面我們發散一下。事務特性 原子性 要麼全部成功要麼全部失敗 一致性 保證事務的前後...