MySQL(25):事务的隔离级别出现问题之 不可重复读
生活随笔
收集整理的這篇文章主要介紹了
MySQL(25):事务的隔离级别出现问题之 不可重复读
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 不可重復讀
所謂的不可重復讀(Non-Repeatable Read)是指事務中兩次查詢的結果不一致,原因是在查詢的過程中其他事務做了更新的操作。
例如,銀行在做統計報表的時候,第一次查詢a賬戶有1000元,第二次查詢a賬戶有900元,原因是統計期間a賬戶取出了100元,這樣導致多次統計報表的結果不一致。
不可重復讀和臟讀有點類似,但是臟讀是讀取了另一個事務未提交的臟數據,不可重復讀是在事務內重復讀取了別的線程已提交的數據。
2. 演示不可重復讀
(1)b賬戶:首先在b賬戶中開啟一個事務,然后在當前事務中查詢各個賬戶的余額信息,查詢結果如下:
(2)a賬戶:在a賬戶中不用開啟事務,直接使用update語句執行更新操作即可,具體語句如下:
update account set money=money-100 where name='a';
由于a賬戶只需要執行修改的操作,不需要保證同步性,因此直接執行SQL語句就可以,執行結果如下所示:
接下來使用select語句查詢a賬戶的余額,如下:
(3)再次回到b賬戶,如下:
b賬戶:當a賬戶中的更新操作執行完畢之后,在b賬戶之中再次查詢各賬戶的余額,發現a賬戶變成900元。
兩次b賬戶查詢的結果不一致,實際上這種操作是沒有錯的
3. 如何解決這個問題?
設置b賬戶的事務的隔離級別
b賬戶:為了防止重復讀的情況發生,可以將該事務的隔離級別設置為Repeatable Read(可重復讀),具體如下:
set session transaction isolation level repeatable read;
總結
以上是生活随笔為你收集整理的MySQL(25):事务的隔离级别出现问题之 不可重复读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10数字权利永久激活神器—HWID
- 下一篇: 基础研究,应用研究,开发研究的定义特点及