數(shù)據(jù)庫的一致性,也是衡量DBMS性能的重要指標之一。目前大多數(shù)商業(yè)數(shù)據(jù)庫(DB2, SQL Server)的并發(fā)控制采用的是兩階段鎖(Two-Phase Locking,2PL)協(xié)議,2PL保證了并發(fā)事務執(zhí)行的可串行化。但2PL在對任何數(shù)據(jù)進行讀、寫操作之前,需要對該數(shù)據(jù)加鎖。在封鎖相容矩陣中,S鎖(Share Locks,共享鎖)和X鎖(Exclusive Locks,排它鎖)是不相容的,因此當事務1正對數(shù)據(jù)A進行讀操作(加S鎖)時,事務2想要對數(shù)據(jù)進行寫操作(加X鎖),那么事務2必須等待事務1釋放數(shù)據(jù)A上的S鎖,才能繼續(xù)執(zhí)行。多版本并發(fā)控制(Multi-Version Concurrency Control,MVCC)較好地解決了這一問題。在多版本的系統(tǒng)中,每一次寫數(shù)據(jù)均產(chǎn)生一個新的版本,讀操作可以根據(jù)需要讀取合適的版本,因此讀寫操作互不阻塞。MVCC雖然提高了并發(fā)度,但也帶來了維護多個版本的存儲開銷。
Microsoft SQL Server 數(shù)據(jù)庫引擎引入了現(xiàn)有事務隔離級別的一種新的實現(xiàn)方式 - 已提交讀,用于提供使用行版本控制的語句級快照。SQL Server 數(shù)據(jù)庫引擎還引入了一個新的事務隔離級別 - 快照,用于提供也使用行版本控制的事務級快照。
將 READ_COMMITTED_SNAPSHOT 數(shù)據(jù)庫選項設置為 ON 可啟用使用行版本控制的已提交讀隔離。將 ALLOW_SNAPSHOT_ISOLATION 數(shù)據(jù)庫選項設置為 ON 可啟用快照隔離。為數(shù)據(jù)庫啟用任一選項時,數(shù)據(jù)庫引擎都將保持被修改的每一行的版本。每當某個事務修改行時,修改前的該行圖像將被復制到版本存儲區(qū)的一頁中。版本存儲區(qū)是 tempdb 中的數(shù)據(jù)頁集合。如果有多個事務修改行,則該行的多個版本將被鏈接到一個版本鏈中。使用行版本控制的讀操作將檢索每一行在事務或語句啟動時已提交的最后一個版本。
為 SQL Server 2008編寫的或 SQL Server 中新增的應用程序,通過在 READ_COMMITTED_SNAPSHOT 數(shù)據(jù)庫選項為 ON 時指定讀提交的事務隔離級別,來實現(xiàn)使用行版本控制的讀提交的隔離。所有讀操作都將查看語句啟動時已提交的行版本。這將提供數(shù)據(jù)的語句級快照。
為 SQL Server 編寫的應用程序將通過在 ALLOW_SNAPSHOT_ISOLATION 數(shù)據(jù)庫選項為 ON 時指定快照事務隔離級別,來實現(xiàn)快照隔離。快照事務中的所有讀操作都將查看事務啟動時已提交的行版本。這將提供數(shù)據(jù)的事務級快照。
對于使用基于行版本控制的隔離級別的事務,讀操作不對數(shù)據(jù)請求共享鎖。這意味著使用行版本控制的讀取器不會妨礙其他讀取器或編寫器訪問同一數(shù)據(jù)。同理,編寫器也不會妨礙讀取器。但是,編寫器會互相妨礙(即使是在基于行版本控制的隔離級別下運行)。兩個寫操作不能同時修改同一數(shù)據(jù)。
“快照隔離”功能擴展了 SQL Server 2008 中的鎖定框架,它使應用程序能夠在發(fā)生任何數(shù)據(jù)修改之前查看值。這可防止應用程序被鎖定,同時仍將提供真正已提交的數(shù)據(jù)。SQL Server 2008 的 Read Committed Snapshot 需要數(shù)據(jù)庫管理員來激活,允許數(shù)據(jù)被只讀事務讀取。所以 SI 對只讀事務的并發(fā)控制效果是很好的,但是對更新事務是否也這樣不得而知。對長時間運行的更新事務來說更為不利于與短期的高競爭性事務。如果跨數(shù)據(jù)庫的事務試圖使用 快照隔離(SI)標準 ,而不是所有數(shù)據(jù)庫都設定的話,則該事務會失敗。這無疑給可擴展性帶來一定的障礙。看來微軟要實現(xiàn)自己的比 SQL 92 規(guī)范還要強的 SI 還有很多路要走。
參考資料:
鎖定和行版本控制: http://technet.microsoft.com/zh-cn/library/ms187101.aspx
分析及解決SQLServer死鎖問題:http://www.wfuwu.com/a/view/8307.html
作者: 自由、創(chuàng)新、研究、探索……
出處:http://shanyou.cnblogs.com/
上一篇 ACCESS:定義表之間的關系
下一篇 分析研究:泛域名解析的罪與罰