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