數據庫是一個共享資源,可以提供多個用戶使用。這些用戶程序可以一個一個地串行執行,
每個時刻只有一個用戶程序運行,
執行對數據庫的存取,
其他用戶程序必須等到這個用戶程
序結束以后方能對數據庫存取。但是如果一個用戶程序涉及大量數據的輸入
/
輸出交換,則
數據庫系統的大部分時間處於閑置狀態。
因此,
為了充分利用數據庫資源,
發揮數據庫共享
資源的特點,
應該允許多個用戶並行地存取數據庫。
但這樣就會產生多個用戶程序並發存取
同一數據的情況,
若對並發操作不加控制就可能會存取和存儲不正確的數據,
破壞數據庫的
一致性,
所以數據庫管理系統必須提供並發控制機制。
並發控制機制的好壞是衡量一個數據
庫管理系統性能的重要標志之一。
DM
用封鎖機制來解決並發問題。它可以保證任何時候都可以有多個正在運行的用戶程序,
但是所有用戶程序都在彼此完全隔離的環境中運行。
一、
並發控制的預備知識
(
一
)
並發控制概述
並發控制是以事務(
transaction
)為單位進行的。
1.
並發控制的單位
――
事務
事務是數據庫的邏輯工作單位,它是用戶定義的一組操作序列。一個事務可以是一組
SQL
語句、一條
SQL
語句或整個程序。
事務的開始和結束都可以由用戶顯示的控制,
如果用戶沒有顯式地定義事務,
則由數據庫系
統按缺省規定自動划分事務。
事務應該具有
4
種屬性:原子性、一致性、隔離性和持久性。
(
1
)原子性
事務的原子性保證事務包含的一組更新操作是原子不可分的,也就是說這些操作是一個整
體,
對數據庫而言全做或者全不做,
不能部分的完成。
這一性質即使在系統崩潰之后仍能得
到保證,
在系統崩潰之后將進行數據庫恢復,
用來恢復和撤銷系統崩潰處於活動狀態的事務
對數據庫的影響,
從而保證事務的原子性。
系統對磁盤上的任何實際數據的修改之前都會將
修改操作信息本身的信息記錄到磁盤上。
當發生崩潰時,
系統能根據這些操作記錄當時該事
務處於何種狀態,
以此確定是撤銷該事務所做出的所有修改操作,
還是將修改的操作重新執
行。
(
2
)一致性
一致性要求事務執行完成后,
將數據庫從一個一致狀態轉變到另一個一致狀態。
它是一種以
一致性規則為基礎的邏輯屬性,
例如在轉賬的操作中,
各賬戶金額必須平衡,
這一條規則對
於程序員而言是一個強制的規定,
由此可見,
一致性與原子性是密切相關的。
事務的一致性
屬性要求事務在並發執行的情況下事務的一致性仍然滿足。
它在邏輯上不是獨立的,
它由事
務的隔離性來表示。
(
3
)
隔離性
隔離性意味着一個事務的執行不能被其他事務干擾。
即一個事務內部的操作及使用的數據對
並發的其他事務是隔離的,
並發執行的各個事務之間不能互相干擾。
它要求即使有多個事務
並發執行,看上去每個成功事務按串行調度執行一樣。這一性質的另一種稱法為可串行性,
也就是說系統允許的任何交錯操作調度等價於一個串行調度。
串行調度的意思是每次調度一
個事務,在一個事務的所有操作沒有結束之前,另外的事務操作不能開始。由於性能原因,
我們需要進行交錯操作的調度,
但我們也希望這些交錯操作的調度的效果和某一個串行調度
是一致的。
DM
實現該機制是通過對事務的數據訪問對象加適當的鎖,從而排斥其他的事
務對同一數據庫對象的並發操作。
(
4
)持久性
系統提供的持久性保證要求一旦事務提交,
那么對數據庫所做的修改將是持久的,
無論發生
何種機器和系統故障都不應該對其有任何影響。例如,自動櫃員機(
ATM
)在向客戶支付
一筆錢時,
就不用擔心丟失客戶的取款記錄。
事務的持久性保證事務對數據庫的影響是持久
的,即使系統崩潰。正如在講原子性時所提到的那樣,系統通過做記錄來提供這一保證。
DM
沒有提供顯式定義事務開始的語句,第一個可執行的
SQL
語句
(
除
CONNECT
語句外
)
隱含事務的開始,
但事務的結束可以由用戶顯式的控制。
在
DM
中以下幾種情況都結束
(
正
常,非正常
)
某一事務:
(
1
)當某一連接的屬性設置為自動提交,每執行一條語句都會提交;
(
2
)遇到
COMMIT/ROLLBACK
語句,便提交
/
回滾一事務;
(
3
)當系統的
DDL
自動提交開關打開時(缺省為打開),遇到
DDL
語句則自動提交該
DDL
語句和以前的
DML
和
DDL
操作;
(
4
)事務所在的程序正常結束和用戶退出;
(
5
)系統非正常終止時;
說明:
DM
在配置文件中提供了
DDL
語句的自動提交開關
DDL_AUTO_COMMIT
。
當此配
置項的值為
1
(缺省情況)時,所有
DDL
語句自動提交;當此配置項的值為
0
時,除
CREATEDATABASE
、
ALTERDATABASE
和
CREATESCHEMA
語句外的所有
DDL
語句
都不自動提交。
DM
中的一致性是以事務為基礎的。
DM
通過提交和回滾分別用於將對數據庫的修改永久化
和廢除,但是無論是提交和回滾,
DM
保證數據庫在每個事務開始前、結束后是一致的。為
了提高事務管理的靈活性,
DM
提供了設置保存點(
SAVEPOINT
)語句和回滾到保存點語
句。
保存點提供了一種靈活的回滾,
事務在執行中可以回滾到某個保存點,
在該保存點以前
的操作有效,而以后的操作被回滾掉。
DM
中的事務同樣具有上述
4
個屬性:原子性、一致性、隔離性和持久性。
2.
並發操作與數據的不一致性
如果沒有鎖定且多個用戶同時訪問一個數據庫,
則當他們的事務同時使用相同的數據時可能
會發生問題,導致數據庫中的數據的不一致性。
一個最常見的並發操作的例子是火車
/
飛機訂票系統中的訂票操作。例如,在該系統中的一
個活動序列:
①
甲售票員讀出某航班的機票張數余額
A
,設
A=16
;
②
乙售票員讀出同一航班的機票張數余額
A
,也是
16
;
③
甲售票員賣出一張機票,修改機票張數余額
A=A-1=15,
把
A
寫回數據庫;