Java如何解决超卖

Python0133

Java如何解决超卖,第1张

一、人数阀门设计:进行用户人群过滤。

商品数量只有100份,秒杀人数有10000人,那么我们就设计1道阀门(根据情况,可以设计3道或者2道都可以的)。

在整点的时候,我们对点击了“购买”按钮后,我们只运行500人进入信息填写页面,信息填写完成后提交订单。效果如下:

①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付

10000人 500人 (这里也可以设计阀门,只允许多少人进入支付)

其他未进入的如何处理乃?显示已抢完或者排队等待(这就是后面要提到的排队系统设计)。

二、会员排队设计:对用户进行排队,排在前面的先购买

这相当于是消息队列模式了,如果秒杀是立即知道结果,排队可能会有点鸡肋。

在第二步②输入信息提交订单后进行排队,排在前面的先购买,排在后面的后购买

三、问答问题设计:过滤掉一些反应慢的用户

在第一步①点击购买后跳转到问题页面,用户必须回答正确问题后,方可进入后面的流程

四、库存缓存设计:缓存库存,判断用户购买的商品是否还有,不读取数据库,速度快,也不会增加数据库负担,

经过前面的过滤,超卖的可能性比较低了提前将商品库存缓存起来,到下单购买的时候,用户购买了就减1,每次都通过库存缓存判断一下,如果为0就显示已抢完。

五、页面静态设计:尽量静态缓存化【CDN那些这里不做考虑】

第一步①商品详情页面,尽量进行缓存,减轻大批量用户在访问商品页面的时候,大量查询数据库。

问答问题页面:全静态,加载快,无数据库负担。

排队等待页面:全静态,加载快,无数据库负担。

排队结束页面:全静态,加载快,无数据库负担。

由秒杀引发的一个问题

我们假设现在商品只剩下一件了,此时数据库中 num = 1;

但有100个线程同时读取到了这个消息 num = 1 ,所以100个线程都开始减库存了。

但你最终会发觉, 其实只有一个线程减库存成功,其他99个线程全部失败。

为何?

这就是MySQL中的排他锁起了作用。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存, 如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁 ,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

就是类似于我在执行update操作的时候,这一行是一个事务 (默认加了排他锁 )。 这一行不能被任何其他线程修改和读写

这种方式采用了 版本号 的方式,其实也就是 CAS 的原理。

假设此时version = 100, num = 1100个线程进入到了这里,同时他们select出来版本号都是version = 100。

然后直接update的时候,只有其中一个先update了,同时更新了版本号。

那么其他99个在更新的时候,会发觉version并不等于上次select的version,就说明version被其他线程修改过了。那么我就放弃这次update

利用redis的单线程预减库存。比如商品有100件。那么我在redis存储一个k,v。例如

每一个用户线程进来,key值就减1,等减到0的时候,全部拒绝剩下的请求。

那么也就是说只有100个线程会进入到后续操作。所以一定不会出现超卖的现象

可见第二种CAS是失败重试,并无加锁。应该比第一种加锁效率要高很多。 类似于Java中的Synchronize和CAS

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

ora-01422: 实际返回的行数超出请求的行数

打开APP

解决:ORA-01422 实际返回的行数超出请求的行数 原创

2019-08-28 22:05:58

1点赞

zhangbeizhen18

码龄11年

关注

错误信息:

ORA-01422: 实际返回的行数超出请求的行数

解析:

将返回值为结果集参数定义为oracle游标类型,本例使用SYS_REFCURSOR类型

1.报错存储过程

2.变更后存储过程

3.本例中使用的建表语句

以上,感谢.

打开CSDN,阅读体验更佳

ORA-01422: 实际返回的行数超出请求的行数_newnazi的博客

错误原因:因为我的参数sno 和搜索的字段名SNO 一样 (不能一样) CREATE OR REPLACE PROCEDURE "serchS" (sno IN VARCHAR2) AS v_name varchar2(20)v_age varchar2(20)BEGIN SELECT SNAME INTO v_name FROM S WHERE SNO...

.../ SQL ORA-01422:精确的提取返回超过请求的行数_温柔彭于晏的博客-C...

如果SELECT INTO语句返回除1行以外的任何内容,则会引发错误.如果返回0行,则会得到一个no_data_found异常.如果它返回超过1行,您将得到一个too_many_rows异常.除非您知道总是有1名工资大于3000的员工,否则您不需要SELECT INTO语句.最...

oracle 报错ORA-01422 实际返回的行数超出请求的行数

首先要知道:select .....into 语句只能够查询一个记录的信息。如果没有查到任何数据,会产生NO_DATA_FOUND异常;如果查询到多个记录,则会产生TOO_MANY_ROWS异常。在这里很明显 “ORA-01422 实际返回的行数超出请求的行数”就是第二种情况,查询到多个记录,所以就会报错,如果必须最后...

继续访问

ora-01422 实际返回的行数超出请求的行数

我出错的地方是在java代码中使用了触发器造成的。

继续访问

热门推荐 ORA-01422: 实际返回的行数超出请求的行数

报错的代码 错误原因:因为我的参数sno 和搜索的字段名SNO 一样 (不能一样) CREATE OR REPLACE PROCEDURE "serchS" (sno IN VARCHAR2) AS v_name varchar2(20)v_age varchar2(20)BEGIN SELECT SNAME INTO v_name FROM S WHERE SNO = sn

继续访问

最新发布 ORA—01422:关于返回行数超出请求的行数错误

说明:empee表copy于Scott.emp表 错误原因:限制条件为deptno,数据不唯一 改进:限制条件换成唯一约束得列,如empno 注1:如果需要接收返回的多行数据,需要用loop end循环语句 注2:这是一个新手都很少犯的错???? ...

继续访问

ORA-01422: exact fetch returns more than requested number of rows

Cause: The number specified in exact fetch is less than the rows returned.Action: Rewrite the query or change numb...

继续访问

Oracle 存储过程报错 ORA-01422

问题:在编写存储过程,执行的时候一直报这个错误,ORA-01422,应该是单行查询返回多个行。 解决方案:首先分析数据,有没有可能出现单行查询返回多个行的情况,对比了老半天,怎么看数据都不可能查出多行记录。最后百度了一下,发现可能是自己定义参数名称和表中的字段名称相同导致参数未传进去,进行了全表查询,所以查出了多条记录。最后修改自己定义的参数名称,问题解决。 备注:以后遇到这种问题,还是要早点...

继续访问

oracle 实际返回的行数超出请求的行数 如何让它返回多行

代码是这个样: createorreplaceproceduredemo3(numoutnumber)as avgsalaryvaluenumber--存放平均工资 onesalaryvaluenumber--存入员工平均工资 begin num:=0selectavg(s.salaryvalue)intoavgsalaryvaluefromsalary...

继续访问

14 | count(*)这么慢,我该怎么办?

在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。 那么今天,我们就来聊聊count(*)语句到底是怎样实现的,以...

继续访问

实际返回的行数超出请求的行数怎么解决_谁说LOOKUP只能模糊查询,有了这个万能公式,想怎么查都行...

前言每当说起在Excel中的查询函数,必提的就是VLOOKUP,虽然功能强大,但是限制是比较死板的,要查询的数据必须位于区域的第一列,而且是单条件查询,在有特殊需求的时候,肯定就会使用到函数嵌套了,显得比较麻烦……,而替代方案,无外乎就两种了,(1)升级版本,换功能强大的软件;(2)找其他的替代函数;如果想升级软件版本的话,Office365就是一个不错的选择,在里面有新增加的xlookup函数,...

继续访问

oracle 实际返回的行数超出请求的行数,行数

题目keywordsCounting.cpp Define a function that, given an istream&and a const vector&, produces a map holding each string (keyword) and the numbers of the line on which the string appears. The ...

继续访问

ORA-01422:实际返回的行数超出请求的行数ORA-06512:在“数据库名.包名”,line710 ORA-06512:在 line3

2019-04-11 Aurora 框架开发--租房信息管理系统踩坑 报错:ORA-01422:实际返回的行数超出请求的行数ORA-06512:在“HEC3DEV.TRAIN_HRMS_HOUSE_INFO_22416”,line710 ORA-06512:在 line3 问题所在:相关的查询语句未加where条件或者where条件有问题,导致查询到多条数据。 代码示例: ...

继续访问

使用MySQL乐观锁解决超卖问题

在秒杀系统设计中,超卖是一个经典、常见的问题,任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难点。 1 超卖问题描述 在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。 问题:当商品A一共有库存15件,用户甲先下单10件,用户乙下单8件,这时候库存只能满足一个人下单成功,如果两个人同时提交,就出现了超卖的问题。 可以采用多种方式解决超卖问题。使用synchronized可以保

继续访问

oracle ora-01422,返回多行时出现ORA-01422错误的解决方法

问:我使用以下Oracle过程,根据输入SQL语句的PO ID可以返回一行或者更多行。当返回多行时,我收到了 ORA-01422错误提示。请问我该如何重新编写过程代码,以便一对多地返回数据行?我有一个硬编码的PO ID('0700185')以便测试用。过程应该可以返回所有单据,有可能是一个也有可能是五个。请您帮助解释一下,因为我不是DBA,对Oracle来说我只是新手,但我有意愿学习。谢谢!CRE...

继续访问

实际返回的行数超出请求的行数怎么解决_用 React Query 来管理数据请求

背景在项目中,通常都需要跟服务端进行异步的数据交互,这包括查询和变更。以一个简单的列表查询为例,我们通过 axios 去请求服务端的列表数据:OK ! 数据已经成功的取到了,也就是我们完成了跟服务端的一次查询交互了。现在我们来尝试更进一步,在 React 中可以通过实现一个 Hooks 把查询做的更优雅一点:Perfect !? 并没有!我们遗漏了非常重要的请求状态的处理,包括异常和请求进行中的情...

继续访问

ora-01422: 实际返回的行数超出请求的行数

解决:ORA-01422 实际返回的行数超出请求的行数

写评论

2

7

1

分享