在上一篇<学习MVC之租房网站(九)-房源显示和搜索>完成了房源的显示、检索,然后是用户的预约看房,以及后台操作员对预约看房的跟单操作。

预约看房仅有将预约信息保存到对应表的操作,预约表有字段标识一条预约是否被受理,接下来后台操作员对未受理的预约请求进行跟单时,会对这个字段的状态做修改,为了防止高并发时多人同时修改,要设计到数据库锁


一 数据库锁

数据库锁分为乐观锁和悲观锁两种,两种锁都是为了保证数据库的单元数据不会被多人同时操作。

a) 悲观锁,悲观锁默认自己在操作数据时,别人一定也会读取,所以每次都会在操作前加锁。查了一下,SqlServer中的悲观锁有十几种之多,这儿仅仅是做初步了解,悲观锁上锁后,连查询也不能进行;从锁的范围来分类,悲观锁又分为表锁和行锁。

b) 乐观锁,乐观锁则默认自己操作数据时,别人不会同时操作。乐观锁要配合表的特殊字段TimeStamp或RowVersion来使用,通过观察操作数据前后TimeStamp或RowVersion的变化情况来判断操作是否成功。

c) 悲观锁上锁后别人不能操作,对系统影响很大。在读取多于写入的系统中,适合使用乐观锁,乐观锁允许更大的吞吐量,但如果是经常写入的系统,就只能使用悲观锁了。另外,乐观锁如果上锁失败会比较尴尬,类似抢红包时,虽然点击了“打开”,但进去后红包却已被抢光了。


二 数据库锁的使用

a) 悲观锁的使用。在原生SQL中,可以使用With(xLock)、With(RowLock)等来上锁,EF则不支持悲观锁,若要使用,可借助EF来传递原生SQL

b) 乐观锁的使用。需要先在数据表增加类型为TimeStamp的字段,新版Sql Server也可以使用RowVersion类型。在EF中使用时,实体要对应添加byte[]类型的属性,FluentAPI配置方法为Property(..).IsRowVersion。EF在SaveChange时会根据TimeStamp判断是否更新成功,如果失败,会抛出DbUpdateConcurrencyException异常,所以更新的代码可以包裹在try-catch中。

注:

课程内容来自如鹏网(www.rupeng.com),专注于大学生就业的在线教育平台;

ASP.NET MVC课程 http://www.rupeng.com/News/9/640.shtml

欢迎关注我的公众号【菜鸟程序员成长记】

学习MVC之租房网站(十)-预约和跟单的更多相关文章

  1. 学习MVC之租房网站(十二)-缓存和静态页面

    在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和 ...

  2. 学习MVC之租房网站(十一)-定时任务和云存储

    学习MVC之租房网站(十一)-定时任务和云存储 在上一篇<学习MVC之租房网站(十)-预约和跟单>完成了用户的预约看房以及后台操作员对预约看房的跟单操作.接下来会做定时发邮件的功能,并且用 ...

  3. 学习MVC之租房网站(二)-框架搭建及准备工作

    在上一篇<学习MVC之租房网站(一)-项目概况>中,确定了UI+Service的“双层”架构,并据此建立了项目 接下来要编写Common类库.配置AdminWeb和FrontWeb 一.编 ...

  4. 学习MVC之租房网站(三)-编写实体类并创建数据库

    在上一篇<学习MVC之租房网站(二)-框架搭建及准备工作>中,搭建好了项目框架,并配置了EF.Log4Net和进程外Session.接下来会编写Eneity类并采用CodeFirst的方式 ...

  5. 学习MVC之租房网站(四)-实现Service层并进行单元测试

    在上一篇<学习MVC之租房网站(三)-编写Eneity类并创建数据库>中,记录了编写Eneity类并采用CodeFirst的方式创建数据库的过程,接下来就到了Service层的实现了,并且 ...

  6. 学习MVC之租房网站(五)-权限、角色、用户管理

    在上一篇<学习MVC之租房网站(四)-实现Service层并进行单元测试>中,记录了实现Service层并进行单元测试的过程,接下来该到"正题"-MVC了,也就是UI层 ...

  7. 学习MVC之租房网站(六)-用户登录和权限控制

    在上一篇<学习MVC之租房网站(五)-权限.角色.用户管理>完成了权限.角色.用户的增删改查,现在将基于前面完成的内容,进行后台用户登录和权限控制功能的开发. 一.用户登录 用户登录涉及到 ...

  8. 学习MVC之租房网站(七)-房源管理和配图上传

    在上一篇<学习MVC之租房网站(六)-用户登录和权限控制>完成了后台用户登录和权限控制功能的开发,接下来要完成的是房源的管理,用户在后台新增.编辑房源信息,供前台用户操作. 一 房源管理 ...

  9. 学习MVC之租房网站(八)- 前台注册和登录

    在上一篇<学习MVC之租房网站(七)-房源管理和配图上传>完成了在后台新增.编辑房源信息以及上传房源配图的功能.到此后台开发便告一段落了,开始实现前台的功能,也是从用户的登录.注册开始. ...

随机推荐

  1. 《Django By Example》第十二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...

  2. 简单实用的JQuery弹出层

    效果: 初始状态时滚动条是可以滚动的 弹出层出现之后:1.弹窗始终居于整个窗口的中间 2.滚动条不可滚动 实现代码: HTML代码: <div class="container&quo ...

  3. jenkins+docker+maven+svn

    环境介绍 1.        软件需求 Jenkins  本次实验所用版本1.5.1 下载链接:https://jenkins.io/index.html Docker 本次实验所用版本 17.03. ...

  4. 老李分享:pep8 python代码规范

    老李分享:pep8 python代码规范 什么是PEPPEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书 . PEP8 译者:本文基于 20 ...

  5. 读Zepto源码之代码结构

    虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...

  6. JDBC基础学习(四)—数据库事务

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

  7. Java中log4j的使用

    前言 距离上一篇文章又过去好长时间了,这段时间一直忙于工作,已经从net彻底转向Java了.工作也慢慢的步入正轨了,自己独自完成了一个小项目,不过工作中遇到了一些问题,还是得到了同学和同事的帮助.本来 ...

  8. Python isinstance

    语法:isinstance(object,type) 作用:来判断一个对象是否是一个已知的类型. 其第一个参数(object)为对象,第二个参数(type)为类型名(int...)或类型名的一个列表( ...

  9. 关于/var/run/docker.sock

    译者按: 这篇博客介绍了什么是/var/run/docker.sock,以及如何使用/var/run/docker.sock与Docker守护进程通信,并且提供了两个简单的示例.理解这些,我们就可以运 ...

  10. angular apply

    <div ng-controller="firstController"> {{date}} </div> <script> var first ...