原创地址: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。