(数据库系统概论|王珊)第十一章并发控制-第一节:并发控制概述
文章目錄
- 一:事務運行方式
- (1)概述
- (2)計算
- (3)調度
- (4)串行調度和并發調度
- 二:并發控制
- (1)并發操作帶來的數據不一致性問題
- A:丟失修改
- B:讀臟數據
- C:不可重復讀
- (2)并發控制概念
- (3)并發控制任務
- (4)并發控制方法
一:事務運行方式
(1)概述
事務的運行方式主要分為串行和并行
- 串行:每個時刻只有一個事務運行
- 并行:同一時刻可以有多個事務同時運行
串行和并行的優缺點如下表,并行效率的確很高,但是會破壞事務的隔離性。因此要在保證一致性的前提下最大限度的提高并發度
不過需要注意的是,在操作系統中就說到過,單處理系統中,所謂的并行實際上是宏觀上的并行運行,微觀上的串行運行,也即 交叉并發
- 本章探討的并發特指交叉并發
我們把允許多個用戶同時使用同一個數據庫的數據庫系統稱之為多用戶數據庫系統,在這種系統中,同一時刻并發運行的事務數量相當龐大。例如我們經常在使用的12306就是一個很典型的例子
(2)計算
兩個事務SSS和TTT,其中SSS有mmm條指令,TTT有nnn條指令,且每個事務內部指令的相對順序不能錯亂,那么可能的執行順序有RRR種
R=Cm+nm=Cmm+n=(m+n)!m!n!R=C^{m}_{m+n}=C^{m+n}_{m}=\frac{(m+n)!}{m!n!}R=Cm+nm?=Cmm+n?=m!n!(m+n)!?
(3)調度
調度:事務的一次執行順序稱之為一個調度,表示事務的指令在系統中執行的時間順序、一組事務的調度必須保證
- 包含了所有事務的操作指令
- 一個事務中指令的順序必須保持不變
(4)串行調度和并發調度
- 串行調度:屬于同一事務的指令緊挨在一起執行,對于有nnn個事務的事務組,可以有nnn!個有效調度
- 并發調度:來自不同事務的指令可以交叉執行。并發調度有可能會導致錯誤結果,僅當并發調度等價于某個串行調度時,則稱該并發調度時可串行化的、正確的
二:并發控制
(1)并發操作帶來的數據不一致性問題
主要有三類數據不一致性問題
- 丟失修改
- 讀臟數據
- 不可重復讀
以如下飛機訂票系統中的活動序列為例
①甲售票點(事務T1T_{1}T1?)讀出某航班的機票余額A,設A=16
②乙售票點(事務T2T_{2}T2?)讀出同一航班的機票余額A,也為16。
③甲售票點賣出一張機票,修改余額A←A-1,所以A為15,把A寫回數據庫。
④乙售票點也賣出一-張機票,修改余額A-A-1,所以A為15,把A寫回數據庫。
A:丟失修改
丟失修改:兩個以上事務從數據庫中讀入同一數據并修改,其中后提交事務的提交結果破壞了先提交事務的提交結果,導致了先提交事務對數據庫的修改丟失
在上面例子中,兩個事務T1T_{1}T1?和T2T_{2}T2?讀入同一數據并修改,但是T2T_{2}T2?提交的結果破壞了T1T_{1}T1?提交的結果,導致T1T_{1}T1?的修改被丟失
B:讀臟數據
讀臟數據:事務1修改某一數據,并將其寫回磁盤;事務2讀取同一數據后,事務1由于某種原因被撤銷,這時事務1已修改過的數據被恢復為原值,事務2讀到的不穩定的瞬間數據就與數據庫中的數據產生了不一致,是不正確的數據,又稱為臟數據
例如T1T_{1}T1?將C值修改為200,T2T_{2}T2?讀到C為200,此時T1T_{1}T1?由于某種原因被撤銷,因此C恢復為原值100,這時T2T_{2}T2?讀到的C為200,屬于讀臟
C:不可重復讀
不可重復讀:事物1讀取數據后,事物2執行更新操作,使事物1無法再現前一次讀取結果。共有三種情況
- 事物2修改了事物1所讀數據,當事物1再次讀該數據時,得到了與前一次不同的值
- 事務2刪除了其中部分記錄,當事務1再次按相同條件讀取數據時,發現某些記錄神秘地消失了
- 事務2插入了一些記錄,當事務1再次按相同條件讀取數據時,發現多了一些記錄
(2)并發控制概念
并發控制:如果多個用戶并發存取數據的行為不加以控制,那么極有可能破壞事務的隔離性和一致性。因此并發控制就是為了保證多用戶并發操作數據庫中信息時的正確性、一致性所采取的措施
(3)并發控制任務
- 對并發操作進行正確調度
- 保證事物的隔離性
- 保證數據庫的一致性
(4)并發控制方法
- 加鎖(Locking)
- 樂觀假設(Optimistic)
- 時間戳(Timestamp)
- 多版本并發控制(MVCC)
總結
以上是生活随笔為你收集整理的(数据库系统概论|王珊)第十一章并发控制-第一节:并发控制概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Network Admini
- 下一篇: web项目中遇到的Maven包依赖冲突问