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

转载于:https://www.cnblogs.com/jfzhu/p/4009918.html

Optimistic Concurrency VS. Pessimistic Concurrency Control相关推荐

  1. ADO.NET - Optimistic Pessimistic Concurrency

    Optimistic currency failed, http://msdn.microsoft.com/en-us/library/aa0416cz.aspx 转载于:https://www.cn ...

  2. java的prefetch()_聊聊FluxFlatMap的concurrency及prefetch参数

    序 本文主要研究下FluxFlatMap的concurrency及prefetch参数 实例 @Test public void testConcurrencyAndPrefetch(){ int c ...

  3. 面试高频——JUC并发工具包快速上手(超详细总结)

    目录 一.什么是JUC 二.基本知识 2.1.进程和线程 2.2.Java默认有两个进程 2.3.Java能够开启线程吗? 2.4.并发和并行 2.5.线程的状态 2.6.wait和sleep的区别 ...

  4. [初级]深入理解乐观锁与悲观锁

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...

  5. 面试题;40个多线程的问题 背1 有用

    Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的 ...

  6. 一文带你了解 MySQL 中的各种锁机制!

    MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁. 行级锁能大大减少数据库操作 ...

  7. 浅谈数据库乐观锁、悲观锁

    来自:非科班的科班 并发问题 当程序中出现并发的问题时,我们就要有相应的手段保证数据的正确性,防止多个用户在操作数据的时候,出现和预期数据不一样的现象,产生脏数据,在数据库的层面如果没有做好并发控制, ...

  8. 数据库事务的悲观锁和乐观锁

    转载出处:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数 ...

  9. mysql 获取距离当前最新的记录_一文带你了解 MySQL 中的各种锁机制!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...

  10. 关系型数据库是如何运作的

    一说到关系型数据库,我总感觉缺了点什么.如果你尝试透过"关系型数据库是如何运作的"的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的.难道说是由于它已经太老旧而已经不再流行吗 ...

最新文章

  1. 《.NET应用架构设计:原则、模式与实践》新书博客--试读-2.1.2 设计原则实战
  2. 2021华为软件精英挑战赛(附赠线下判题器链接)——经历
  3. ansible代码发布系统
  4. jquery中$.post()方法的简单实例
  5. 数组作为实参传给函数的形参指针
  6. 【git】git 入门使用手册
  7. jq之$(“:button“)
  8. CVE-2021-35464: ForgeRock AM远程代码执行漏洞
  9. 2008年9月三级网络技术考试试卷 参考答案1
  10. android 15.6寸平板,关于HUAWEI 华为M6 10.8英寸平板的槽点,不吐不快
  11. tablelayout
  12. DOS命令大全:MS-DOS命令详解
  13. latex标记html样式,latex标题字体大小和样式
  14. css修改图标字体大小,css-更改AngularJS材质图标的图标大小
  15. 数据结构和算法知识点整理
  16. 【秋招机试真题】华为机试0811-1-叠积木
  17. object mapping for [details] tried to parse field [details] as object, but found concrete value
  18. 根据刚刚,1分钟前,1小时前,几天前显示文章发布日期
  19. ML - 贷款用户逾期情况分析5 - 特征工程2(特征选择)
  20. 【第6章】MySQL函数

热门文章

  1. [codevs1746][NOI2002] 贪吃的九头龙 树形DP
  2. android双卡切换流量代码,双卡双待手机流量怎么切换 方法有哪些【图文】
  3. qnx slm7.1(程序员开发手册-翻译)
  4. [动态树] HDOJ 5467 Clarke and hunger games
  5. 为什么说汽车VIN码是汽车唯一的身份证
  6. 李若彤揭秘退隐10年原因:感情不顺 父亲离世 曾患抑郁症
  7. 老男孩教育67期--day02--操作系统硬件知识
  8. 破解第三课 关键跳和关键CALL
  9. flac转mp3方法,flac转mp3步骤
  10. 划分离散数学定义_《离散数学》学习记录 - 集合论