日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

031_mysql事务的安全隐患

發(fā)布時間:2025/5/22 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 031_mysql事务的安全隐患 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 事務(wù)的安全隱患

1. 讀的安全隱患

1.1. 臟讀: 一個事務(wù)讀到另外一個事務(wù)還未提交的數(shù)據(jù)。事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù), 然后B回滾操作, 那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)。

1.2. 不可重復(fù)讀: 一個事務(wù)讀到了另外一個事務(wù)提交的數(shù)據(jù), 造成了前后兩次查詢結(jié)果不一致。事務(wù)A多次讀取同一數(shù)據(jù), 事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交, 導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時, 結(jié)果不一致。

1.3. 幻讀: 一個事務(wù)讀到了另一個事務(wù)insert的數(shù)據(jù), 造成前后查詢結(jié)果不一致。系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級, 但是系統(tǒng)管理員B就在這個時候插入了一條具體分?jǐn)?shù)的記錄, 當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)多出了一條記錄, 就好像發(fā)生了幻覺一樣, 這就叫幻讀。

1.4. 不可重復(fù)讀的和幻讀很容易混淆, 不可重復(fù)讀側(cè)重于修改, 幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行, 解決幻讀需要鎖表。

二. 事務(wù)的隔離級別

1. 查詢當(dāng)前的mysql8的默認(rèn)隔離級別。

2. 隔離級別第一級別: 讀未提交(read-uncommitted)

2.1. 打開客戶端A, 先將事務(wù)的隔離級別設(shè)定為讀未提交, 并開啟事務(wù)。

2.2. 客戶端A, 查詢用戶信息。

2.3. 客戶端A未提交事務(wù), 打開客戶端B, 并開啟事務(wù), 扣除客戶1的100塊錢, 不提交事務(wù)。

2.4. 客戶端B未提交事務(wù), 客戶端A查看用戶信息, 查到了客戶端B更新的數(shù)據(jù)。

2.5. 客戶端B執(zhí)行了回滾操作, 那么客戶端A之前讀到的數(shù)據(jù)就是臟數(shù)據(jù)。

2.6. 此時, 客戶端A減少客戶1的100塊錢, 發(fā)現(xiàn)執(zhí)行前后, 客戶1都是900塊, 并沒有變成800塊。因?yàn)? 客戶端A讀到了客戶端B更新的數(shù)據(jù), 后來客戶端B又回滾了數(shù)據(jù), 客戶端A讀到了一條臟數(shù)據(jù)。

3. 讀已提交(第二級別 read-committed)

3.1. 讀已提交解決了臟讀問題, 但是出現(xiàn)了不可重復(fù)讀問題, 存在幻讀問題。

3.2. 打開客戶端A, 設(shè)置當(dāng)前的事務(wù)隔離級別為read committed(未提交讀), 開啟事務(wù), 查詢表Account的所有記錄。

3.3. 打開客戶端B, 開啟事務(wù), 減少客戶1的100塊錢, 未提交事務(wù)。

3.4. 客戶端A, 在客戶端B更新數(shù)據(jù)前后, 查詢的數(shù)據(jù)一樣, 解決了臟的問題。

3.5. 客戶端B提交事務(wù)。

3.6. 客戶端A查詢到了客戶端B提交的數(shù)據(jù)。產(chǎn)生了不可重復(fù)讀的問題, 客戶端A進(jìn)行同樣的2次查詢, 2次查詢結(jié)果不一致。

4. 可重復(fù)讀(第三級別 repeatable read)

4.1. 打開客戶端A, 設(shè)置當(dāng)前的事務(wù)隔離級別為repeatable read (可重復(fù)讀), 開啟事務(wù), 查詢表Account的所有記錄。

4.2. 打開客戶端B, 開啟事務(wù), 扣除客戶1的100塊錢, 未提交事務(wù)。

4.3. 客戶端B更新數(shù)據(jù), 未提交事務(wù), 查詢客戶端A, 客戶端B更新數(shù)據(jù)前后, 客戶端的數(shù)據(jù)不變, 解決了臟讀問題。

4.4. 客戶端B提交事務(wù)。

4.5. 客戶端B提交事務(wù)后, 查詢客戶端A, 數(shù)據(jù)依然不變。

4.6. 客戶端B重新開啟事務(wù), 插入一條數(shù)據(jù), 并且提交事務(wù)。

4.7. 客戶端B插入一條數(shù)據(jù), 并且提交事務(wù)后, 客戶端A查詢數(shù)據(jù), 依然是以前的數(shù)據(jù)??蛻舳薃提交事務(wù)后, 查詢出了最新數(shù)據(jù)。

5. 可串行化(第四級別 serializable)

5.1. 打開客戶端A, 設(shè)置事務(wù)隔離級別為可串行化, 開啟事務(wù), 查詢Account表。

5.2. 打開客戶端B, 開啟事務(wù), 查詢Account表, 客戶端B可以進(jìn)行查詢操作。

5.3. 在客戶端B, 執(zhí)行一個更新操作, 客戶端B卡住了, 如果此時客戶端A提交或回滾事務(wù), 客戶端B會更新成功; 如果客戶端A長時間沒有提交或回滾事務(wù), 客戶端B的更新操作就超時報錯。

5.4. 如果有一個連接的隔離級別設(shè)置為了串行化, 那么誰先打開了事務(wù), 就會在整張表上加了一個鎖, 其它事務(wù)不能進(jìn)行寫操作。這種事務(wù)隔離級別解決了所有的安全問題。但是這種隔離級別一般比較少用, 容易造成性能上的問題, 效率比較低。

6.事務(wù)的隔離級別, 按效率劃分, 從高到低: 讀未提交-->讀已提交-->可重復(fù)讀-->可串行化。

7.事務(wù)的隔離級別, 按攔截程度, 從高到底: 可串行化-->可重復(fù)讀-->讀已提交-->讀未提交。

8. MySQL和Oracle默認(rèn)的事務(wù)隔離級別

8.1. MySQL默認(rèn)的事務(wù)隔離級別是: 可重復(fù)讀。

8.2. Oracle默認(rèn)的事務(wù)隔離級別是: 讀已提交。

9. 隔離級別

9.1. 讀未提交, 引發(fā)問題臟讀。?

9.2. 讀已提交, 解決臟讀, 引發(fā)不可重復(fù)讀。

9.3. 可重復(fù)讀, 解決臟讀、不可重復(fù)讀、幻讀。

9.4. 可串行化, 解決臟讀、不可重復(fù)讀、幻讀, 同時似乎給整張表添加了一個鎖, 客戶并發(fā)讀, 但不能并發(fā)寫。

10. 悲觀鎖(排它鎖)

10.1. 丟失更新

10.2. 悲觀鎖

10.3. 客戶端A開啟事務(wù), 給用戶1的減少100塊, 沒有提交事務(wù)。

10.4. 客戶端B開啟事務(wù), 刪除用戶1, 客戶端B卡頓了, 超時報錯。

10.5. 客戶端A提交事務(wù)。

10.6. 客戶端B刪除用戶1成功。

總結(jié)

以上是生活随笔為你收集整理的031_mysql事务的安全隐患的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。