一起谈.NET技术,技术详解:三招优化.NET中的锁(组团)

  在这篇文章中,我将使用三个方法处理乐观锁,包括ADO.NET数据集、SQL Server时间戳数据类型和新旧值检查,首先我们从并发谈起,探讨5个并发问题,然后从实际出发,利用这三种方法实现乐观锁。

  为什么需要锁?
  在多用户环境中,大家同时更新相同的记录可能会引发冲突,这个问题用专业的术语描述就叫做并发性。并发会造成什么样的冲突?并发主要会导致四种常见的问题,详细情况请看下表。

  如何解决上述冲突?
  答案是使用乐观锁或悲观锁,下面将进一步进行阐述。什么是乐观锁?顾名思义,乐观锁假设多个事务相互不会影响对方,换句话说就是,在乐观锁模式下,没有锁操作会得到执行,事务只是验证是否有其它事务修改数据,如果有则进行事务回滚,否则就提交。

  乐观锁是如何工作的?
1、实现乐观锁的方法有多种,但基本原则都一样,总是少不了下面五个步骤:
2、记录当前的时间戳
3、开始修改值
4、在更新前,检查是否有其他人更新了值(通过检查新旧时间戳实现)
5、如果不相等就回滚,否则就提交

图 1 乐观锁的工作原理

  实现乐观锁的解决方案

  在.NET中,实现乐观锁的方法主要有三种:
1、数据集(Dataset):数据集是实现乐观锁的默认方法,在更新前它会检查新旧值。
2、时间戳数据类型(timestamp):在你的表中创建一个timestamp数据类型,在更新时,检查旧时间戳是否等于新时间戳。
3、直接检查新旧值:在更新时检查旧值和新值是否相等,如果不相等就回滚,否则就提交。

  解决方案1:数据集
  正如前面所说的,数据集是处理乐观锁的默认方法,下面是一个简单的快照,在Adapter的update函数上有一个调试点,当我移除断点运行update函数时,它抛出如下图所示的并行异常错误。

图 2 Update函数执行时抛出的异常错误

  如果你运行后端分析器,你将会看到更新语句检查当前值和旧值是否相等:

  在这种情况下,我尝试将“AuthorName”字段值修改为“This isnew”,但更新时会检查旧值“This is old author”,下面是比较旧值的精简代码段:

  解决方案2:使用timestamp数据类型

  SQL Server有一个数据类型是timestamp,它是实现乐观锁的另一种途径,每次更新SQL Server数据时,时间戳会自动产生一个唯一的二进制数值,时间戳数据类型可用来版本化你的记录更新。

图 3 timestamp数据类型

  为了实现乐观锁,首先需要取得旧的时间戳值,在更新时检查旧的时间戳值是否等于当前时间戳,如:

  然后检查是否发生了更新操作,如果没有发生更新,则使用SQL Server的raiserror产生一系列错误消息。

  如果发生了并发冲突,当你如下图所示这样调用ExecuteNonQuery时,你应该会看到错误传播。

图 4 时间戳发生变化,存储过程产生了错误

  解决方案3:检查旧值和新值
  许多时候,我们只需要检查相关字段值的一致性,其它字段则可以忽略,在update语句中,我们可以直接做这种比较。

时间: 2024-10-25 00:12:37

一起谈.NET技术,技术详解:三招优化.NET中的锁(组团)的相关文章

技术详解:三招优化.NET中的锁(组团)

在这篇文章中,我将使用三个方法处理乐观锁,包括ADO.NET数据集.SQL Server时间戳数据类型和新旧值检查,首先我们从并发谈起,探讨5个并发问题,然后从实际出发,利用这三种方法实现乐观锁. 为什么需要锁? 在多用户环境中,大家同时更新相同的记录可能会引发冲突,这个问题用专业的术语描述就叫做并发性.并发会造成什么样的冲突?并发主要会导致四种常见的问题,详细情况请看下表. 如何解决上述冲突? 答案是使用乐观锁或悲观锁,下面将进一步进行阐述.什么是乐观锁?顾名思义,乐观锁假设多个事务相互不会影

一起谈.NET技术,详解ASP.NET MVC 2中的新ADO.NET实体框架

.NET框架4.0的发行推出了许多优秀的增强功能,其中当首推ADO.NET实体框架.该框架已经克服了以前的许多错误,并提供了一组增强的API,其中包括许多新的LINQ to SQL框架方面的改善.在本文中,我们将使用这些API的功能来创建一个通用版本的数据仓库. 一.实体框架概述 实体框架针对数据模型提供了一些更方便的操作方法.默认情况下,设计器可以生成一个描述数据库的模型. 尽管表格间的映射未必都是1:1的映射.每个表格使用一个ObjectSet加以描述,进而ObjectSet对象又提供了相应

【独家】老庙黄金2016春晚抢红包活动技术架构详解

[编者按]2016春晚红包技术实践系列选题来了!阿里云有一支特殊的团队--护航团队.从最初的12306到现在的红包,每一个备受关注的项目背后都有他们的身影.今年护航团队由支付宝.阿里云和其他技术伙伴组成.本文来自驻云科技COO兼首席架构师肖凯的纯干货分享,欢迎交流反馈.   肖凯 驻云科技COO兼首席架构师 云计算技术践行者,曾帮助新华社.陌陌.航天信息等数百家企业完成上云,曾就职于IBM.EMC等外企,对企业互联网化转型及企业IT架构有深刻理解,坚信公有云才是企业IT的未来. 下为正文: 抢红

阿里云上的容器技术实践详解

为什么选择阿里云 本文讲的是阿里云上的容器技术实践详解,现在的公有云如雨后春笋,国外如AWS.Azure.Bluemix,国内如BAT.DaoCloud.goodrain,都可以给大家提供丰富的云基础设施和上层服务,那么,为什么选择阿里云呢?主要有三点想法: 我们使用阿里云的服务已经有5年了,从企业级PaaS平台合作开始,再到帮助我们的一些客户逐步迁云,对阿里云的能力还是比较熟悉的. 因为要做的是容器,国外AWS,Azure虽然有,但AWS在中国一直没"正规"数据中心(唯一的一个前几天

局域网中VPN以太网接入技术的详解

    局域网中关于VPN以太网接入技术的详解,宽带普及以后,经常面临VPN以太网接入技术的问题.所以,今天我准备向大家介绍VPN以太网接入技术的设置技巧,希望本文能教会你更多东西,为大家的生活带来方便. 从二十世纪八十年代开始以太网就成为最普遍采用的网络技术,根据IDC的统计,以太网的端口数约为所有网络端口数的85%.1998年以太网卡的销售是4800万端口,而令牌网.FDDI网和ATM等网卡的销售量总共才是500万端口,只是整个销售量的10%.而以太网的这种优势仍然有继续保持下去的势头. 传

Android热修复技术原理详解与升级探索

在2017云栖大会-上海峰会上手机淘宝资深无线开发工程师甘晓霖(万壑)作了题为<Android热修复技术原理详解与升级探索>的分享,如何实现客户端与开发节奏最快同步,阿里云为此开发了移动热修复框架Sophix.它在代码修复.资源修复.SO库修复中都展示了极高的能力,在于其他竞品的对比中,Sophix展示出来极大的优势,并且非常容易上手.

Masonry自动布局详解三:remake约束

Masonry自动布局详解三:remake约束 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 效果图 本节详解Masonry的以动画的形式更新约束的

第七篇Bootstrap表单布局实例代码详解(三种表单布局)_javascript技巧

Bootstrap提供了三种表单布局:垂直表单,内联表单和水平表单.下面逐一给大家介绍,有兴趣的朋友一起学习吧. 创建垂直或基本表单: •·向父 <form> 元素添加 role="form". •·把标签和控件放在一个带有 class .form-group 的 <div> 中.这是获取最佳间距所必需的. •·向所有的文本元素 <input>.<textarea> 和 <select> 添加 class .form-cont

Android Studio 插件开发详解三:翻译插件实战

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 一:概述 如果不了解插件开发基础的同学可以先看, Android Studio 插件开发详解一:入门练手 Android Studio 插件开发详解二:工具类 在上面的两篇文章,讲解了插件开发的基础,今天就来一个优点难度的项目,插件的名字叫 AndroidPluginTranslate , 顾名思义就是可以翻译文案的插件,废话不多说,先看最