原创地址:http://www.cnblogs.com/jfzhu/p/4009918.html

转载请注明出处

(一)为什么需要并发控制机制

并发控制机制是为了防止多个用户同时更改同一条数据,也可以防止一个用户在更改数据的同时造成另一个用户看到”过期”的数据。下面看一个例子就明白了。

John和Marry有一个联合银行帐户,帐户的余额是$1000,John向帐户里存入了$500,Marry取走了$500,如果没有并发控制,John最后看到的余额是$1500,而Marry看到的帐户余额是$500。

而如果使用了并发控制机制,在John读取帐户余额的时候,该帐户就被锁死了,Mary没有办法读取或者修改该帐户,直到John完成操作,把锁释放了。

(二)Optimistic Concurrency Control与Pessimistic Concurrency Control

有两种并发控制机制,Optimistic concurrency control(乐观?)和Pessimistic concurrency control(悲观?),两者之间的区别是:

Pessimistic concurrency control使用的机制是用户A在读取或修改某条记录(rows)时,将该记录锁死,防止其他用户同时读取或修改同一条记录。直到用户A释放掉锁,其他用户才可以对记录读取或修改,所以Pessimistic Lock的缺点是容易导致系统性能瓶颈。

Optimistic concurrency control在某条记录被读取时不会将记录锁死,只有当发现某条记录被多个用户同时修改的时候,其中一个用户的修改可以被提交(commit),其他用户会收到一个异常告知他们的修改没有成功。

(三)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。

Optimistic Concurrency VS. Pessimistic Concurrency Control的更多相关文章

  1. 第17/24周 悲观并发控制(Pessimistic Concurrency)

    大家好,欢迎回到性能调优培训.今天标志着第5个月培训的开始,这个月我们会谈论SQL Server里的锁.阻塞和死锁(Locking, Blocking, and Deadlocking). SQL S ...

  2. Optimistic concurrency control

    Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...

  3. Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁

    Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...

  4. Concurrency vs. Parallelism

    http://getakka.net/docs/concepts/terminology Terminology and Concepts In this chapter we attempt to ...

  5. Concurrency Is Not Parallelism (Rob pike)

    Rob pike发表过一个有名的演讲<Concurrency is not parallelism>(https://blog.golang.org/concurrency-is-not- ...

  6. Entity Framework Tutorial Basics(28):Concurrency

    Concurrency in Entity Framework: Entity Framework supports Optimistic Concurrency by default. In the ...

  7. [Hive - LanguageManual] Hive Concurrency Model (待)

    Hive Concurrency Model Hive Concurrency Model Use Cases Turn Off Concurrency Debugging Configuration ...

  8. WCF Concurrency (Single, Multiple, and Reentrant) and Throttling

    http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and Introduc ...

  9. Jmeter系列(11)- 并发线程组Concurrency Thread Group详解

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html Concurrency Thread ...

随机推荐

  1. nodejs+mysql 断线重连

    var mysql = require('mysql'); var conn; function handleError () { conn = mysql.createConnection({ ho ...

  2. Stack Overflow: The Architecture - 2016 Edition(Translation)

    原文: https://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 作者:Nick Cra ...

  3. echarts中显示效果option中必有的属性

    写一个最简单的效果让option中不可缺少的属性. var option = { xAxis:[ //x轴,数组对象,其下至少有一个对象 {.....} ], yAxis:[//y轴,数组对象,其下可 ...

  4. JavaScript(三) 正则表达式 以及实现的功能

    RegExp 是正则表达式的缩写.定义RegExp正则表达式 RegExp 对象用于存储检索模式. 通过 new 关键词来定义 RegExp 对象.以下代码定义了名为 p 的 RegExp 对象,其模 ...

  5. jave ee之 servlet 记录

    1:没有自动生成web.xml文件 解决方法:新建web工程的时候最后会选择是否创建web.xml文件 2:通过url映射无法打开对应网站 <servlet> <servlet-na ...

  6. 【转】C/S,B/S区别

    C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势. ...

  7. MySQL学习笔记01_数据库基础知识

    01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...

  8. Android 利用RecyclerView.Adapter刷新列表中的单个view问题

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  9. C#调用win32 api程序实例

    1.声明static extern 方法,使用DllImport特性 class MyClass { [DllImport("kernel32", SetLastError = t ...

  10. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)

    原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...