數據庫並行訪問也就是兩個或兩以上用戶同時訪問同一數據這也是數據庫引擎如何設計和實現適度反應所面臨的最大問題設計優良性能卓越的數據庫引擎可以輕松地同時為成千上萬的用戶服務而底氣不足的數據庫系統隨著更多的用戶同時訪問系統將大大降低其性能最糟糕的情況下甚至可能導致系統的崩潰
當然並行訪問是任何數據庫解決方案都最為重視的問題了為了解決並行訪問方面的問題各類數據庫系統提出了各種各樣的方案 SQL Server和Oracle兩大DBMS也分別采用了不同的並行處理方法它們之間的實質差別在哪裡呢?
並行訪問的問題
並行訪問出現問題存在若干種情況在最簡單的情形下數量超過一個的用戶可能同時查詢同一數據就這種情況而言數據庫的操作目標很簡單盡可能地為用戶們提供快速的數據訪問 這對我們現在常見的數據庫來說不成問題SQL Server和 Oracle 都采用了多線程機制它們當然能夠一次處理多個請求
不過在用戶修改數據的情況下並行訪問問題就變得復雜起來了顯然數據庫通常只允許唯一用戶一次修改特定的數據當某一用戶開始修改某塊數據時 SQL Server和 Oracle 都能很快地鎖定數據阻止其他用戶對這塊數據進行更新直到修改該數據的第位用戶完成其操作並提交交易(commit transaction)但是當某一位用戶正在修改某塊數據時假設另一位用戶又正想查詢該數據的信息時會發生什麼情況呢?在這種情況下數據庫管理系統又該如何動作呢?Oracle 和 SQL Server針對這一問題采取了不同的解決方案
SQL Server方法
現在不妨假設有人開始修改SQL Server上存儲的數據於是這塊數據立即被數據庫鎖定數據鎖定操作阻塞其他任何訪問該數據的連接——連查詢操作都不會放過於是這塊被鎖定的數據只有在交易被提交或者回滾之後才能接受其他訪問操作
下面用SQL Server隨帶的pubs示例數據庫做一個簡單示范在Query Analyzer內打開兩個窗口在第個窗口中執行下列SQL操作語句更新pubs數據庫中某一圖書的價格
use pubs
go
begin tran
update titles
set price = price *
where
title_id = BU
由於代碼中並沒有執行commit語句所以數據變動操作實際上還沒有最終完成接下來在另一個窗口裡執行下列語句查詢titles數據表
select title_idtitleprice
from titles
order by title_id
你什麼結果也得不到窗口底部的小地球圖標會轉個不停盡管我在先前的操作中僅僅更新了一行但是select語句的執行對象卻恰好包含了其數據正被修改的一行因此上面的操作不會返回任何數據除非回到第個窗口提交交易或者回滾
SQL Server的數據鎖定方案可能會降低系統的性能和效率數據被鎖定的時間越長或者鎖定的數據量越大其他數據訪問用戶就越可能不得不等待其查詢語句的執行因此從程序員的角度來看對SQL Server編程的時候應該盡量地把交易代碼設計得既小又快
From:http://tw.wingwit.com/Article/program/Oracle/201311/17702.html