SQL Server 2005 Beta 2 快照隔離

xsb發表於2008-07-14
Ref: [@more@]
SQL Server 和 Oracle 在快照上的不同之處
Microsoft SQL Server 2005Oracle

不需要進行表修改

在使用 SERIALIZABLE 前需要使用 INITRANS >= 3 & MAXTRANS on CREATE/ALTER TABLE DDL 來啟用頁面上事務資訊的空間。

版本儲存被儲存在 TempDB 中。DBA 必須確保基於版本儲存工作負載為改進的 i/o 頻寬最佳化 TempDB,因此必須監視 TempDB 資料庫大小,很多版本的 SQL Server 都支援百分比和絕對資料庫/日誌自動增長設定,但這些顯然受到磁碟物理可用性的限制。

要求 ROLLBACK SEGMENTS(定義和聯機/離線)的複雜配置和事務級別 USE ROLLBACK SEGMENT 語句以避免 ORA-01555:“長期執行”事務導致的“快照太舊。”覆蓋它們在回滾部分的版本控制頁。注意:Oracle 沒有“長期執行”事務的定義。

TempDB 可以按照當前大小的 %(以便彈性地減少自動增長嘗試的次數)或是按照某個絕對值來自動增長。

ROLLBACK SEGMENTS 不支援 PCTINCREASE,因此也不會“自動增長”,所以您必須在建立它們時取得大小。

基於行的資料版本控制 – 寫入版本儲存/從版本儲存中讀取的資料量更少,行級版本控制意味著事務化資料訪問的真正行級順序

基於頁的資料版本控制 – Oracle 必須重新構建整個頁。當其他事務使用 SERIALIZABLE 訪問已更新頁上的其他行時會導致 ORA-08177:"Can't serialize access for this transaction."

Snapshot Isolation 和 Read Committed 在資料庫級別上被啟用。只有要求此選項的資料庫需要啟用它,併產生與它相關的開銷。您必須使用快照隔離在各個將要參加交叉資料庫事務的資料庫中啟用它。

資料版本控制不是可選的;它總是被啟用。

大量的操作“效能計數器”,允許 DBA 監視版本儲存的狀態,包括:

TempDB 中的可用空間

版本儲存的大小

增長率

衝突數

最長期執行活動事務

Perfmon 計數器

虛擬表允許 DBA 檢視快照事務是否已產生,以及版本儲存的大小和版本儲存中的最早記錄:

sys.dm_tran_active_snapshot_database_transactions()

sys.dm_tran_top_version_generators()

sys.dm_tran_transactions_snapshot()

sys.dm_tran_current_transaction()

sys.dm_tran_version_store()

虛擬表

Oracle 和 SQL Server 2005 之間既有如上所述的不同之處(這些不同是為了方便資料庫管理員的工作),也有相同之處(為了方便開發人員將應用程式從 Oracle 端接到 Microsoft SQL Server 2005)。

SQL Server 和 Oracle 在快照上的相同之處
Microsoft SQL Server 2005Oracle

SELECT ( WITH (UPDLOCK)

等價項,立即執行衝突檢查

SELECT( FOR UPDATE

用於鎖定事務中的記錄以防止衝突

READ COMMITTED(帶有行版本控制)

READ COMMITTED

SNAPSHOT

SERIALIZABLE

SNAPSHOT

READ ONLY

READ UNCOMMITTED(訪問未提交的資料)

沒有等價項

READ COMMITTED(鎖定)

沒有等價項

REPEATABLE READ

沒有等價項

SERIALIZABLE

沒有等價項

可以在樂觀隔離級別中使用鎖定或必須處理衝突(資料行在事務外更新)並重新嘗試已經失敗的事務。行級版本控制減少了衝突的機會。

必須處理衝突(ORA-08177:資料頁在事務外更新)並重新嘗試已經失敗的事務。

應用程式可以選擇合適的併發模式。

應用程式總是看見可能的陳舊資料,因為在併發模式之間沒有選擇。

Transact-SQL TRY/CATCH 邏輯處理衝突錯誤,但不會處理 TempDB 的空間問題。

PL/SQL 具有錯誤處理,它支援 ORA-08177(衝突)錯誤處理,但不能處理 ORA-01555(回滾部分空間問題)。

理解併發控制

就像在使用情境中看到的,在控制併發時主要使用兩種模型:悲觀併發和樂觀併發。在基於悲觀併發控制的系統下,鎖定被用於阻止使用者以影響其他使用者的方式修改資料。一旦應用了鎖定,其他使用者就不能執行可能與鎖定衝突的操作,直到所有者釋放鎖定。這種級別的控制通常用於存在較多資料爭用的環境,以及如果/當併發突出產生時使用鎖定來保護資料的成本小於回滾事務的成本的環境中。相反,在基於樂觀併發控制的系統中,使用者在讀取資料時並不鎖定資料。在執行更新時,系統會檢查是否有另一個使用者在資料被讀取後更改了資料。如果另一個使用者更改了資料,就會產生一個錯誤。通常,使用者收到錯誤後會回滾事務,重新提交(應用程式/環境相關)和/或啟動。這被稱為樂觀併發,因為它主要用於低資料爭用的環境中,以及讀取時偶然回滾事務的成本超過鎖定資料的成本的環境中(請注意,在 Read Committed 下執行的更新和 Snapshot Isolation 下執行的更新不會衝突,因此不會導致回滾成本)。

在 SQL Server 2005 之前,事務是以悲觀方式控制的,這意味著所有事務都獲得鎖定。儘管鎖定是多數應用程式的最佳併發控制選擇,但是它也會導致編寫器阻止讀取器。如果某個事務更改了某一行,那麼在編寫器提交之前另一個事務就不能讀取該行。在一些情況下,等待更改完成是正確的響應;但在另一些情況下,以前的行事務一致性狀態就足夠了。

基於快照的隔離級別使得讀取器能夠取得先前提交的行值,代價是在修改行時必須保留此版本——即使“當前”沒有人正在訪問資料也是一樣。這意味著所有選擇、更新和刪除(但不插入)語句可能都要付出版本控制的代價(進出版本儲存的額外的 I/O)。您必須作出決定,使得這一交換可以在開銷和效能的代價下獲得更好的併發。要說明的很重要的一點是,儘管可能需要花費更多代價來執行每次查詢(因為版本控制),但是最終的結果可能是您可以支援更多的吞吐量(因為爭用降低了)。它可以應用在爭用消耗吞吐量的環境中,這很重要;如果您使用這種技術作為不是由爭用引起的效能問題的解決方案,那麼您可能就是在解決錯誤的問題,並且實際上,會降低您的系統吞吐量。

一般說來,當資料庫透過基於版本控制的隔離自動控制您的資料檢視時,應用程式程式設計會比價容易。在這種環境中,您較少擔心死鎖和阻止,而是在管理性管理開銷和效能上額外付出了一點代價。在很多情況下,對於 TempDB 來說可能更容易選擇在管理性開銷和提供更多磁碟吞吐量上付出代價。如果所有基於查詢的快照都只能提供讀取一致性,而不能提供後續修改的基礎;那麼就不需要任何應用程式重試邏輯。但是,您最終可能會在使用快照隔離級別並且後來執行了更新的事務中遇到衝突;如果版本是“陳舊的”,那麼您可能需要使用重試邏輯進行更新。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12402/viewspace-1007246/,如需轉載,請註明出處,否則將追究法律責任。

相關文章