SQL SERVER 并发【2015.12.16】
并发控制模型
1.悲观并发控制:
A.默认冲突存在,当前进程通过获取当前数据的锁阻止其他进程的访问。
B.读与写之间是相互阻塞。
2.乐观并发控制:
A.使用行版本控制保持数据被操作前的状态。
B.读与写之间不会相互阻塞;但是写会发生阻塞,SQL SERVER会把冲突的错误信息发送给上层的应用程序。
并发造成的数据行为
1.丢失更新
当两个进程都读取数据A并修改了数据值,就会造成某个进程修改的数据值被覆盖。
数据A=10
| 时间 | 进程1 | 进程2 |
| 1 | SELECT A | |
| 2 | SELECT A | |
| 3 | UPDATA A=A+10 | |
| 4 | UPDATE A=A+20 |
运行完,数据A=30
进程1对数据A的修改被丢失了。
2.脏读
进程1修改数据A值但未提交,进程2读取了修改后的数据A,随后进程1又回滚了对数据A的修改,造成进程2读取了不一致的状态值。
数据A=10
| 时间 | 进程1 | 进程2 |
| 1 | UPDATA A=A+10(未提交) | |
| 2 | SELECT A | |
| 3 | UPDATA A=A-10(回滚) |
A值本身没有变化,但是进程2读取的A值为20。
3.不可重复读
进程1读取数据A之后,进程2修改了数据A,进程1再次读取A值,与之前读取的A值不一致。
4.幻影
这种行为发生在一个数据集内的部分数据被修改。
事务的隔离级别
事务的隔离性:如果多个事务对同一数据进行处理,就需要对数据进行锁定以保证数据的一致性。
1.未提交读 (Uncommitted Read)
事务2可以读取事务1已经修改过但未提交的数据A。
优点:事务2读取数据A不占用任何锁。
缺点:无法保证数据的高一致性。
2.已提交读 (Read Committed)
事务2只能读取事务1修改并已提交完成的数据A。
A.已提交读(锁定)-> 悲观并发控制模型
事务1对数据A持排他锁以进行更新,事务2只能等待这些锁释放以后才能使用这个数据。
事务2访问数据,最少要对数据加共享锁,如果其它事务要更新数据比较等待。
B.已提交读(快照)- 乐观并发控制模型
数据A每次被更新,都会生成最新的快照存储起来,事务读取这个快照,避免读取到未提交的更新值。
3.可重复读(Repeatable Read)
在“已提交读”的基础上,增加:事务1两次查询数据A,数据发生改变。这要求共享锁必须保留至事务1结束。
4.快照(Snapshot)
类似于“已提交读(快照)”,如果当前版本被锁定,允许读取已提交数据的早期版本。
与“已提交读(快照)”的区别在于早期版本该有多早这个问题。
问题:快照隔离,可能导致两个事务同时进行,并引起一个任何序列化执行都不可能产生的结果。
5.可串行化(Serializable)
在“可重复读”的基础上增加:同一事务中,重新执行查询,数据集不会发生变化。
可以防止幻影行为。
SQL SERVER 并发【2015.12.16】的更多相关文章
- delphi连接sql server的字符串2011-10-11 16:07
delphi连接sql server的字符串2011-10-11 16:07 一.delphi连接sql server 放一个连接组件 ADOConnection, 其它组件TADODataSet,T ...
- SQL Server代理(10/12):使用代理账号运行作业
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这一系列的上一篇,你查看了msdb库下用 ...
- SQL Server代理(5/12):理解SQL代理错误日志
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...
- 读写分离提高 SQL Server 并发性能
以下内容均非原创,仅作学习.分享!! 在 一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡. ...
- 读写分离提高 SQL Server 并发性
转自:http://www.canway.net/Lists/CanwayOriginalArticels/DispForm.aspx?ID=476 在一些大型的网站或者应用中,单台的SQL Serv ...
- Sql Server并发和事务
锁的作用范围通常在事务中,事务是建立在并发模式下. 从SQL Server 2005开始,加入了一种新的并发模式-----乐观并发.不管使用哪种并发模式,如果多个会话同时修改相同的数据,都会产生资源争 ...
- SQL Server代理(11/12):维护计划作业
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这一系列的上一篇,我们看了使用代理帐户模 ...
- SQL Server代理(9/12):理解作业和安全
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的前一篇文章里,你学习了如何在S ...
- SQL Server代理(8/12):使用SQL Server代理外部程序
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的上篇文章里,你学习如何使用SQ ...
随机推荐
- GJM:用C#实现网络爬虫(二) [转载]
上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行 ...
- JSON.NET 使用技巧
1. 序列化相关技巧 通过特性忽略某些属性 有时候我们会有这样的需求,我们只需要序列化实体类中的一部分属性,这时候我们可以通过声明忽略掉一些我们不需要序列化的属性,有两种方式可以使用么达到这个目标: ...
- jQuery Layer 弹层组件
layer是一款近年来口碑非常不错的web弹层组件,她具备全方位的解决方案,致力于服务各个水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 在与同类组件的比较中,layer总是能轻易获胜.她 ...
- Boba.js – 用于 Google 统计分析 JavaScript 库
Boba.js 是一个小的,易于扩展的 JavaScript 库,让谷歌分析(Google Analytics)的更灵活,更容易.它同时支持旧的 ga.js 库以及新的 analytics.js 库. ...
- Mithril – 构建杰出 Web 应用的 JS MVC 框架
Mithril 是一个客户端的 Javascript MVC 框架.它是一个工具,使应用程序代码分为数据层,UI 层和粘合层.提供了一个模板引擎与一个虚拟的 DOM diff 实现,用于高性能渲染,支 ...
- OC中的深拷贝与浅拷贝
深拷贝(deep copy)与浅拷贝(shallow copy)的定义一直是有争论的. 一种理解是: 所谓的浅拷贝, 就是不完全的拷贝 NSString *s = @"123"; ...
- assign,copy,strong,weak,nonatomic的理解
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段 ...
- UIApplication是什么
1.UIApplication对象是应用程序的象征 2.每一个应用都有自己的UIApplication对象,而且是单例的(只有一个) 3.通过[UIApplication sharedAppl ...
- android自定义activity
今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...
- 【Gson】2.2.4 StackOverflowError 异常
正文 错误: 08-09 09:56:51.904: E/AndroidRuntime(16384): java.lang.StackOverflowError 08-09 09:56:51.904: ...