繼續上篇部落格 事務特性及隔離問題。
我們來做乙個關於隔離級別的實驗,將演示各個級別導致的隔離問題。
我們先開啟兩個mysql視窗,來模擬併發操作。
髒讀只有read uncommitted級別才會發生髒讀問題,所以將其中乙個視窗的隔離級別設定為read uncommitted。輸入set transaction isolation level read uncommitted;
在mysql5.5的64位版本中輸入該段**是無法修改隔離級別的,應該輸入set session transaction isolation level read committed;
修改隔離級別後,該視窗就被允許發生髒讀。現在給這兩個視窗命名一下,方便後續講解,我們就令設定了事務隔離級別的視窗為b,另乙個視窗為a。
在a、b視窗分別開啟乙個事務,輸入start transaction;
現在同時檢視兩個使用者的表資料
現在在a視窗完成轉賬操作,輸入
update account set money = money -
200where name =
'aaa'
;update account set money = money +
200where name =
'bbb'
;
然後查詢表資料
轉賬操作成功執行。
此時在b視窗進行查詢
會發現,b視窗讀取到了a視窗未提交的資料,此時在a視窗進行回滾操作,再次查詢表資料
兩個使用者的表資料都回到了原來的狀態,但是b視窗在之前查詢資料的時候,是確認了aaa賬戶轉賬了200元給bbb賬戶的,而此時轉賬操作卻被回滾了,錢又相當於轉回給了aaa賬戶,此時就造成了bbb賬戶的經濟損失,這就是髒讀現象。
不可重複讀
修改事務隔離級別,在b視窗輸入set transaction isolation level read committed;
這次我們重複剛才的操作,兩邊同時開啟事務,然後在a視窗更新資料,接著兩邊都查詢一下表資料
此時會發現,在a視窗未提交之前,b視窗的資料不會改變。這時候就避免了髒讀,但是它會導致不可重複讀。我們讓a視窗提交,然後再次到b視窗查詢
此時b視窗的表資料發生了變化,讀取到了a視窗提交的結果,需要注意的是,b視窗在同乙個事務中卻讀取到了兩次不同的表資料,這就是不可重複讀。
虛讀修改事務隔離級別,在b視窗輸入set transaction isolation level repeatable read;
在a、b視窗分別開啟乙個事務,在a視窗轉賬提交,b視窗連續地查詢,會發現b視窗是不會讀取到a提交的結果的,這樣就避免了不可重複讀。
在a視窗輸入更新語句
update account set money = money-
500where name =
'bbb'
;update account set money = money+
500where name =
'ccc'
;
然後提交a視窗的操作,查詢兩邊的表資料
發現即使a視窗提交了操作,b視窗的表資料仍然不會被改變,證實了剛才的結論,但是該隔離級別會導致虛讀的產生。很遺憾的是,虛讀無法為大家舉例了,因為虛讀發生的概率是非常低的,但是方法還是給大家介紹一下。
在a視窗插入一條資料,輸入insert into account values (4,'ddd',1000);
,然後在b視窗進行表資料查詢,如果查詢到了a視窗插入的資料,說明發生了虛讀,但很顯然,這個現象並沒有發生,所以圖我就不貼了。
最後介紹一下最後乙個事務隔離級別
演示一下serializable的序列處理效果。
將b視窗的級別設定為serializable,然後在a、b視窗同時開啟乙個事務,此時在b視窗執行查詢語句,然後在a視窗插入或更新一條資料,輸入insert into account values(5,'eee',1000);
當你按回車鍵執行語句時,你會發現,a視窗並沒有馬上執行sql語句,而是阻塞了。那這是為什麼呢?因為該級別是最高隔離級別,採取序列處理方法,在乙個使用者操作該資料庫時,不允許別的使用者操作。
事務併發問題和隔離級別
事務有四個屬性,acid。事務併發會造成三個問題 髒讀,不可重複讀,幻讀。髒讀 事務a讀了事務b更新的資料,然後事務b回滾撤銷了,事務a讀取的資料就是髒讀。不可重複讀 事務a讀取資料num後,事務b對其修改,事務a再次讀取資料num,前後不一致,這情況為不可重複讀。幻讀 事務a讀取資料 一張表 事務...
MySQL事務隔離級別 解決併發問題
mysql事務隔離級別 1.髒讀 騙錢的手段,兩個視窗或執行緒分別呼叫資料庫轉賬表,轉賬後未提交,對方檢視到賬後,rollback,實際錢沒轉.演示方法 mysql預設的事務隔離級別為repeatable read 比oracle高,因為mysql本身弱 使用select tx isolation ...
事務的隔離級別和引發的問題
以mysql為例 查詢當前事務的隔離級別用 select tx isolation 設定隔離級別用 set session transaction isolation level 隔離級別 例如 set session transaction isolation level read uncommi...