網站首頁 編程語言 正文
為什么一級封鎖協議不能保證不讀取到臟數據?
- 為什么一級封鎖協議不能保證不讀取到臟數據
??一級封鎖協議可以保證某事務在修改數據之前必須先加直到事務結束才會釋放的排他鎖,這看起來就已經阻止了臟讀,那為什么各個書中都表示一級封鎖協議不能保證不讀取到臟數據呢?
??這還是要歸咎于各個書籍編寫者對于概念定義的疏忽大意。在弄清這個問題之前,需要澄清被很多人誤解的概念。比如什么是臟讀、一級封鎖協議等。筆者已經將這部分的內容獨立成了另一篇博客,可見:
剖析數據庫中重要而又常被曲解的概念:
https://blog.csdn.net/wangpaiblog/article/details/122780648
為什么一級封鎖協議不能保證不讀取到臟數據
??有了前面的鋪墊,現在就可以很方便地解釋這個問題了。因為一級封鎖協議只針對修改作出限制,沒有對讀取作出約束。在這種情況下,如果一個事務已經修改了數據,對該數據加了排他鎖。此時,如果另一個事務只是讀取而不修改該數據,則該事務就會讀到“臟”數據。
??為什么加了排他鎖之后還可以讀取呢?因為排他鎖本身不能阻止修改和讀取,它只能根據自身的互斥法則來進行限制。當事務只是讀取數據時,根據一級封鎖協議,它不需要先加任何鎖,因此它的讀數據操作不會受到限制而成功進行。
??那一級封鎖協議如何阻止并發修改呢?如果另一個事務只修改而不讀取。那么根據一級封鎖協議,它需要先加排他鎖,但問題是該數據已經加了排他鎖,所以這次的加鎖操作將不能成功,從而使得這個事務無法修改數據。
【注意】
??有人對 為什么一級封鎖協議不能保證不讀取到臟數據
的解釋是,如果一個事務在其它事務加排他鎖之前讀取該數據,這個事務就會讀取到臟數據,所以一級封鎖協議不能保證不讀取到臟數據。這是錯誤解釋。在加排他鎖之前讀取到的數據是“舊”數據,而不是“臟”數據。
原文鏈接:https://blog.csdn.net/wangpaiblog/article/details/122787733
相關推薦
- 2022-05-11 在?.NET?平臺使用?ReflectionDynamicObject?優化反射調用的代碼詳解_實用
- 2023-04-24 FFmpeg實戰之分離出PCM數據_C 語言
- 2022-07-21 SpringBoot默認開啟AOP,采用Cglib代理方式?(Spring AOP快速入門)
- 2022-04-25 老生常談C語言中指針的使用_C 語言
- 2022-01-15 let、var、const區別
- 2022-02-26 小程序使用AntV F2自定義圖表和legend交互
- 2022-06-24 python包相關知識點之包的導入、相對路徑以及絕對路徑_python
- 2022-06-14 C#獲取指定目錄下指定文件的方法_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支