如何解决高并发秒杀的超卖问题

如何解决高并发秒杀的超卖问题,第1张

由秒杀引发的一个问题

我们假设现在商品只剩下一件了,此时数据库中 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

分享

分布式锁的三种实现方式分别是:基于数据库实现分布式锁、基于缓存(Redis等)实现分布式锁、基于Zookeeper实现分布式锁。

一、基于数据库实现分布式锁

1、悲观锁

利用select … where … for update 排他锁。

注意:其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。

2、乐观锁

所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源, *** 作过程中认为不存在并发冲突,只有update version失败后才能觉察到,抢购和秒杀就是用了这种实现以防止超卖,通过增加递增的版本号字段实现乐观锁。

二、基于缓存(Redis等)实现分布式锁

1、使用命令介绍:

(1)SETNX

SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

(2)expire

expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

(3)delete

delete key:删除key

在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。

2、实现思想:

(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

三、基于Zookeeper实现分布式锁

ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。

基于ZooKeeper实现分布式锁的步骤如下:

(1)创建一个目录mylock。

(2)线程A想获取锁就在mylock目录下创建临时顺序节点。

(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁。

(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点。

(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

扩展资料;

一、数据库分布式锁实现的缺点:

1、db *** 作性能较差,并且有锁表的风险。

2、非阻塞 *** 作失败后,需要轮询,占用cpu资源。

3、长时间不commit或者长时间轮询,可能会占用较多连接资源。

二、Redis(缓存)分布式锁实现的缺点:

1、锁删除失败,过期时间不好控制。

2、非阻塞, *** 作失败后,需要轮询,占用cpu资源。

三、ZK分布式锁实现的缺点:

性能不如redis实现,主要原因是写 *** 作(获取锁释放锁)都需要在Leader上执行,然后同步到follower。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8710194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存