簡述
關系型數據庫有四個顯著的特征,即安全性、完整性、并發性和監測性。數據庫的安全性就是要保證數據庫中數據的安全,防止未授權用戶隨意修改數據庫中的數
據,確保數據的安全。在大多數數據庫管理系統中,主要是通過許可來保證數據庫的安全性。完整性是數據庫的一個重要特征,也是保證數據庫中的數據切實有效、
防止錯誤、實現商業規則的一種重要機制。在數據庫中,區別所保存的數據是無用的垃圾還是有價值的信息,主要是依據數據庫的完整性是否健全。在SQL
Server
7.0中,數據的完整性是通過一系列邏輯來保障的,這些邏輯分為三個方面,即實體完整性、域完整性和參考完整性。對任何系統都可以這樣說,沒有監測,就沒
有優化。這句話用在數據庫管理系統方面,也是切合實際的。只有通過對數據庫進行全面的性能監測,也才能發現影響系統性能的因素和瓶頸,才能針對瓶頸因素,
采取切合實際策略,解決問題,提高系統的性能。并發性也是一個非常重要的概念,它是用來解決多個用戶對同一數據進行操作時的問題。特別是對于網絡數據庫來
說,這個特點更加突出。提高數據庫的處理速度,單單依靠提高計算機的物理速度是不夠的,還必須充分考慮數據庫的并發性問題,提高數據庫并發性的效率。那么
如何保證并發性呢?在這個面向下一世紀的數據庫產品SQL Server 7.0中,通過使用事務和鎖機制,解決了數據庫的并發性問題。
事
務和鎖是兩個緊密聯系的概念。事務就是一個單元的工作,包括一系列的操作這些操作要么全部成功,要么全部失敗。事務確保多個數據的修改作為一個單元來處
理。例如,在銀行業務中,有一條記帳原則,即有借有貸,借貸相等。那么為了保證這種原則,就得有確保借和貸的登記要么同時成功,要么同時失敗。如果出現只
記錄了借,或者只記錄了貸,那么就違反了記帳原則,就會出現記錯帳的情況。SQL
Server通過支持事務機制管理多個事務,保證事務的一致性。事務使用鎖,防止其他用戶修改另外一個還沒有完成的事務中的數據。對于多用戶系統來說,鎖
機制是必須的。在SQL Server 7.0中,使用事務日志來保證修改的完整性和可恢復性。
SQL
Server有多種鎖,允許事務鎖定不同的資源。鎖就是保護指定的資源,不被其他事務操作。為了最小化鎖的成本,SQL
Server自動地以與任務相應等級的鎖來鎖定資源對象。鎖定比較小的對象,例如鎖定行,雖然可以提高并發性,但是卻有較高的開支,因為如果鎖定許多行,
那么需要占有更多的鎖。鎖定比較大的對象,例如鎖定表,會大大降低并發性,因為鎖定整個表就限制了其他事務訪問該表的其他部分,但是成本開支比較低,因為
只需維護比較少的鎖。
事務和鎖具有以下特點:
- 事務是一個單元的工作,要么全做,要么全不做
- 事務保證操作的一致性和可恢復性
- 每一條Transact-SQL語句都可以是一個事務
- 實際使用的事務是用戶定義的事務,它包括一系列操作或者語句
- 在多服務器環境中,使用用戶定義的分布式事務,保證操作的一致性
- 鎖是保證并發控制的手段
- 可以鎖定的資源包括行、頁、簇、表和數據庫
- 鎖的類型主要包括共享鎖和排它鎖
- 特殊類型的鎖包括意圖鎖、修改鎖和模式鎖
- 共享鎖允許其他事務繼續使用鎖定的資源
- 排它鎖只允許一個事務訪問數據
- 系統本身可以處理死鎖
- 用戶可以根據實際情況定制鎖的一些特征
事務
事務的定義
事務是指一個單元的工作,這些工作要么全做,要么全部不做。作為一個邏輯單元,必須具備四個屬性:原子性、一致性、獨立性和持久性。原子性是指事務必須是
一個自動的單元工作,要么執行全部數據的修改,要么全部數據的修改都不執行。一致性是指當事務完成時,必須使所有數據都具有一致的狀態。在關系型數據庫
中,所有的規則必須應用到事務的修改上,以便維護所有數據的完整性。所有的內部數據結構,例如樹狀的索引與數據之間的鏈接,在事務結束之后,必須保證正
確。獨立性是指并行事務的修改必須與其他并行事務的修改相互獨立。一個事務看到的數據要么是另外一個事務修改這些事務之前的狀態,要么是第二個事務已經修
改完成的數據,但是這個事務不能看到正在修改的數據。這種特征也稱為串行性。持久性是指當一個事務完成之后,它的影響永久性的產生在系統中,也就是這種修
改寫到了數據庫中。
事務機制保證一組數據的修改要么全部執行,要么全部不執行。SQL
Server使用事務保證數據的一致性和確保在系統失敗時的可恢復性。事務是一個可以恢復的單元的工作,由一條或者多條Transact-SQL語句組
成,可以影響到表中的一行或者多行數據。事務打開以后,直到事務成功完成之后提交為止,或者到事務執行失敗全部取消或者滾回去為止。
鎖
悲觀鎖定 假定任何時刻存取數據時,都可能有另一個客戶也正在存取同一筆數據,因而對數據采取了數據庫層次的鎖定狀態,在鎖定的時間內其它的客戶不能對資
料進行存取,對于單機或小系統而言,這并不成問題,然而如果是在網絡上的系統,同時間會有許多聯機,如果每一次讀取數據都造成鎖定,其后繼的存取就必須等
待,這將造成效能上的問題,造成后繼使用者的長時間等待。
樂觀鎖定(optimistic locking)則樂觀的認為資料的存取很少發生同時存取的問題,因而不作數據庫層次上的鎖定,為了維護正確的數據,樂觀鎖定使用應用程序上的邏輯實現版本控制的解決。
例如若有兩個客戶端,A客戶先讀取了賬戶余額1000元,之后B客戶也讀取了賬戶余額1000元的數據,A客戶提取了500元,對數據庫作了變更,此時
數據庫中的余額為500元,B客戶也要提取300元,根據其所取得的資料,1000-300將為700余額,若此時再對數據庫進行變更,最后的余額就會不
正確。
在不實行悲觀鎖定策略的情況下,數據不一致的情況一但發生,有幾個解決的方法,一種是先更新為主,一種是后更新的為主,比較復雜的就是檢查發生變動的數據來實現,或是檢查所有屬性來實現樂觀鎖定。