在web应用中,一个账户,会有N多个涉及到数字的字段。比如一个账户的金额,积分等。这些字段就涉及到增减的情况。如果是在测试环境下,靠程序员或者测试手动点击。一般是发现不了问题。

一旦上到正式环境下。有真实用户做操作了,就很容易出现莫名其妙的金额和流水记录不一致的情况。如果没有足够的经验,很难排查出问题。

据我了解,业界一般用使用三种解决方案

  • 1.使用消息队列
  • 2.悲观锁
  • 3.乐观锁

因为博主自身处于小公司,对于消息队列没有实际操作经验。所以本篇文章主要讨论后面两种。

悲观锁

从名字上看,就是认为一定会发生并发的可能性,从源头上杜绝数据错乱的情况。

常见的处理方式:

数据库加锁。如SQL server的RowLock和Mysql中的for update

优点:程序没问题的情况下完全不会出现数据问题

缺点:性能不太好,数据库锁是非常消耗资源的行为

乐观锁

乐观锁和悲观锁相反。认为不会有并发问题。只在提交修改的时候,去检查一下当前这条数据是否有修改的迹象。

常见处理方式:

在数据库中加入一个列。记录下当前修改的版本号。每次修改的时候,判断版本号是否和之前查询出的是否一致,如果一致的。修改成功,不一致,无法修改。需要重新加载一次查询数据,然后循环判断操作

伪代码如下:

ndex =   //约定重试次数
while(true){
selct id ,money ,version from table //查询当前记录
money+=; //修改数据
update table set money = money,version = (version+) where id = @id and version = version //更新到数据库,判断是否更新成功
if(update){
break;
}
// index+=;
if(index>){
break;
} }

乐观锁优点: 可以实现无锁操作,性能会比悲观锁高很多

乐观锁缺点:有脏读问题,而且查询次数会比悲观锁多几倍

了解这两种方式,已经可以纵横各大中小型应用了。

 
 

Web应用程序并发问题处理的一点小经验的更多相关文章

  1. web开发-给即将毕业实习生的一点面试经验

    简历投递: 智联招聘51job 像赶集网和58同城最好别去投 面试的公司,特别是深圳这边,面试的时候公司小,很多人,八九不离十是那种搞培训的,很多时候,有些公司会主动打电话来教你去面试,这些绝大多数也 ...

  2. Global一点小经验

    Global: Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法,他位于应用程序根目录下. 这个 Global.asax ...

  3. 模仿下拉框datalist的jquery插件的一点小经验

    原本项目里是用h5的新属性data-list,但是这个下拉框的数据太多,而data-list似乎没有设置高度的地方,所以写了个小插件,期间也发现了一些bug,目前这个版本算是可以一用的版本,故写一下这 ...

  4. KInect AR沙盒制作的一点小经验

    最近在微博上看到这样一条 微博  >点这看< 看起来非常有意思,就去Google了一下如何制作. 没想到这是一个开源项目,而且还告诉你如何安装 OK,接下来就说说我的制作过程. 首先,先放 ...

  5. gulp+webpack+angular1的一点小经验(第一部分gulp与webpack的整合)

    时间匆匆如流水继上周熟悉了gulp的初步安装与环境配置以后,我的项目又进入了新的阶段! 这篇文章将把我这一周遇到的一些问题,以及解决的方式做一个小小的总结,不一定记的完整,但都是个人的一点经验,分享给 ...

  6. 关于前端js拼接字符串的一点小经验

    1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()"  点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现 ...

  7. gulp+webpack+angular1的一点小经验(第三部分使用一些angular1的插件ui-bootstrap与highcharts)

    第一个要介绍的是我们的麻烦制造器:angular-ui-bootstrap ui-bootstrap可以有很多通用的插件给大家用,比如弹窗啊(modal),翻页控件啊(pagination),为什么说 ...

  8. gulp+webpack+angular1的一点小经验(第二部分webpack包起来的angular1)

    又一周过去了,项目也已经做得有点模样了.收集来一些小经验,分享给大家,有疏漏之处,还望指正,海涵. 上周整合了gulp与webpack,那么工具准备差不多了,我们就开始编码吧.编码的框架就是angul ...

  9. 【Django】有关多用户管理的一点小经验分享

    前言 最近,笔者因为需要开发一个系统作为毕设的展示,因此就产生了有关多用户管理的问题.在这里我把自己的需求重新阐明一下:能够通过Django自带的用户管理框架,实现多用户的管理,例如登录.登出.ses ...

随机推荐

  1. Fire Balls 08——音效的添加

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  2. solr 的基本用法

    上图为 solr 的搜索页面,常用字段的基本用法如下: 1. q: 查询字符串,过滤条件,不能为空,必须输入,如果查询全部就写 * : * name:“马”  AND age:[0 TO 18]   ...

  3. 【Bit String Reordering UVALive - 6832 】【模拟】

    题意分析 题目讲的主要是给你一个01串,然后给你要变成的01串格式,问你要转换成这一格式最少需要移动的步数. 题目不难,但当时并没有AC,3个小时的个人赛1道没AC,归根到底是没有逼自己去想,又想的太 ...

  4. web scraper 抓取数据并做简单数据分析

    其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标 ...

  5. 033 模块4-PyInstaller库的使用

    目录 一.PyInstaller库基本介绍 1.1 PyInstaller库概述 1.2 pip的使用 1.3 pip install pyinstaller (cmd命令行) 二.PyInstall ...

  6. 如何让基于.NET 2.0的应用在高版本的系统上运行?

    我们的WinForm项目是基于.NET 2.0开发的,在部署时,发现有些机器没有.NET 2.0,但是即使这些机器有装.NET 2.0 以上的版本,也无法运行我们的程序.这就比较蛋疼了. 我们查了一下 ...

  7. linux常见报错

    零.目录 一. 文件和目录类 File exist 文件已经存在 No such file or directory 没有这个文件或目录(这个东西不存在) command not found 命令找不 ...

  8. NPOI 导出添加批注功能

    这个问题在网上搜,都是说如下即可: //添加批注HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();HSSFComme ...

  9. numpy库使用总结

    numpy study 0x01:n维数组对象ndaarray 存放同类型元素的多维数组 0x02:numpy数据类型 numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 ...

  10. js中对时间的操作

    我们先来看一下如何获取当前时间: var date = new Date() //输出:Tue Jul 02 2019 10:36:22 GMT+0800 (中国标准时间) 紧接着,我们来获取相关参数 ...