原創地址:http://www.cnblogs.com/jfzhu/p/4009918.htmlphp
轉載請註明出處html
(一)爲何須要併發控制機制數據庫
併發控制機制是爲了防止多個用戶同時更改同一條數據,也能夠防止一個用戶在更改數據的同時形成另外一個用戶看到」過時」的數據。下面看一個例子就明白了。session
John和Marry有一個聯合銀行賬戶,賬戶的餘額是$1000,John向賬戶裏存入了$500,Marry取走了$500,若是沒有併發控制,John最後看到的餘額是$1500,而Marry看到的賬戶餘額是$500。併發
而若是使用了併發控制機制,在John讀取賬戶餘額的時候,該賬戶就被鎖死了,Mary沒有辦法讀取或者修改該賬戶,直到John完成操做,把鎖釋放了。post
(二)Optimistic Concurrency Control與Pessimistic Concurrency Control性能
有兩種併發控制機制,Optimistic concurrency control(樂觀?)和Pessimistic concurrency control(悲觀?),二者之間的區別是:spa
Pessimistic concurrency control使用的機制是用戶A在讀取或修改某條記錄(rows)時,將該記錄鎖死,防止其餘用戶同時讀取或修改同一條記錄。直到用戶A釋放掉鎖,其餘用戶才能夠對記錄讀取或修改,因此Pessimistic Lock的缺點是容易致使系統性能瓶頸。.net
Optimistic concurrency control在某條記錄被讀取時不會將記錄鎖死,只有當發現某條記錄被多個用戶同時修改的時候,其中一個用戶的修改能夠被提交(commit),其餘用戶會收到一個異常告知他們的修改沒有成功。code
(三)SQL Server
SQL Server默認使用的是Pessimistic Concurrency Control,數據庫隔離級別(isolation level)是read committed。從SQL Server 2005開始,微軟增長了對Optimistic Concurrency Control的支持,兩個新的數據庫隔離級別,SNAPSHOT 和 READ COMMITTED SNAPSHOT isolation (RCSI)
SQL Server支持的隔離級別有以下幾個:
Isolation level |
Dirty read |
Non-repeatable read |
Phantom |
Read uncommitted |
Yes | Yes | Yes |
Read committed |
No | Yes | Yes |
Repeatable read |
No | No | Yes |
Snapshot | No | No | No |
Serializable |
No | No | No |
設置隔離級別能夠用如下命令:
SET TRANSACTION ISOLATION LEVEL
查看隔離級別可使用:
SELECT CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL FROM sys.dm_exec_sessions where session_id = @@SPID
或者
DBCC useroptions
SQL Server默認使用的隔離級別是Read Committed。
(四)Dynamics CRM
Microsoft Dynamics CRM 2013 實施指南中提到:
運行使用 SQL Server(配置了已提交讀快照隔離 (RCSI))的 Microsoft Dynamics CRM 將得到商業上合理的支持。商業上合理的支持是指 Microsoft 客戶支持服務所提供的、不須要修改 Microsoft Dynamics CRM 代碼的全部合理的支持。—參見 《SQL Server deployment》
可是有一些文章並不建議使用RCSI,好比《The Potential Dangers of the Read Committed Snapshot Isolation Level》,因此我也不建議將數據庫隔離級別修改成RCSI。
(五)總結
本文介紹了爲何要使用併發控制機制,什麼是Optimistic Concurrency Control和Pessimistic Concurrency Control,SQL Server所使用的併發控制機制,如何設置和查看數據庫的隔離級別,以及Dynamics CRM須要慎用RCSI。