1. 不可重複讀session
所謂的不可重複讀(Non-Repeatable Read)是指事務中兩次查詢的結果不一致,緣由是在查詢的過程當中其餘事務作了更新的操做。spa
例如,銀行在作統計報表的時候,第一次查詢a帳戶有1000元,第二次查詢a帳戶有900元,緣由是統計期間a帳戶取出了100元,這樣致使屢次統計報表的結果不一致。線程
不可重複讀和髒讀有點相似,可是髒讀是讀取了另外一個事務未提交的髒數據,不可重複讀是在事務內重複讀取了別的線程已提交的數據。code
2. 演示不可重複讀blog
(1)b帳戶:首先在b帳戶中開啓一個事務,而後在當前事務中查詢各個帳戶的餘額信息,查詢結果以下:事務
(2)a帳戶:在a帳戶中不用開啓事務,直接使用update語句執行更新操做便可,具體語句以下:同步
update account set money=money-100 where name='a';
因爲a帳戶只須要執行修改的操做,不須要保證同步性,所以直接執行SQL語句就能夠,執行結果以下所示:io
接下來使用select語句查詢a帳戶的餘額,以下:table
(3)再次回到b帳戶,以下:class
b帳戶:當a帳戶中的更新操做執行完畢以後,在b帳戶之中再次查詢各帳戶的餘額,發現a帳戶變成900元。
兩次b帳戶查詢的結果不一致,實際上這種操做是沒有錯的
3. 如何解決這個問題?
設置b帳戶的事務的隔離級別
b帳戶:爲了防止重複讀的狀況發生,能夠將該事務的隔離級別設置爲Repeatable Read(可重複讀),具體以下:
set session transaction isolation level repeatable read;