189 8069 5689

mysql怎么防止超卖 如何防止mysql数据库攻击

如何处理数据库并发问题

想要知道如何处理数据并发,自然需要先了解数据并发。

创新互联是一家集网站建设,大化企业网站建设,大化品牌网站建设,网站定制,大化网站建设报价,网络营销,网络优化,大化网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

什么是数据并发操作呢?

就是同一时间内,不同的线程同时对一条数据进行读写操作。

在互联网时代,一个系统常常有很多人在使用,因此就可能出现高并发的现象,也就是不同的用户同时对一条数据进行操作,如果没有有效的处理,自然就会出现数据的异常。而最常见的一种数据并发的场景就是电商中的秒杀,成千上万个用户对在极端的时间内,抢购一个商品。针对这种场景,商品的库存就是一个需要控制的数据,而多个用户对在同一时间对库存进行重写,一个不小心就可能出现超卖的情况。

针对这种情况,我们如何有效的处理数据并发呢?

第一种方案、数据库锁

从锁的基本属性来说,可以分为两种:一种是共享锁(S),一种是排它锁(X)。在MySQL的数据库中,是有四种隔离级别的,会在读写的时候,自动的使用这两种锁,防止数据出现混乱。

这四种隔离级别分别是:

读未提交(Read Uncommitted)

读提交(Read Committed)

可重复读(Repeated Read)

串行化(Serializable)

当然,不同的隔离级别,效率也是不同的,对于数据的一致性保证也就有不同的结果。而这些可能出现的又有哪些呢?

脏读(dirty read)

当事务与事务之间没有任何隔离的时候,就可能会出现脏读。例如:商家想看看所有的订单有哪些,这时,用户A提交了一个订单,但事务还没提交,商家却看到了这个订单。而这时就会出现一种问题,当商家去操作这个订单时,可能用户A的订单由于部分问题,导致数据回滚,事务没有提交,这时商家的操作就会失去目标。

不可重复读(unrepeatable read)

一个事务中,两次读操作出来的同一条数据值不同,就是不可重复读。

例如:我们有一个事务A,需要去查询一下商品库存,然后做扣减,这时,事务B操作了这个商品,扣减了一部分库存,当事务A再次去查询商品库存的时候,发现这一次的结果和上次不同了,这就是不可重复读。

幻读(phantom problem)

一个事务中,两次读操作出来的结果集不同,就是幻读。

例如:一个事务A,去查询现在已经支付的订单有哪些,得到了一个结果集。这时,事务B新提交了一个订单,当事务A再次去查询时,就会出现,两次得到的结果集不同的情况,也就是幻读了。

那针对这些结果,不同的隔离级别可以干什么呢?

“读未提(Read Uncommitted)”能预防啥?啥都预防不了。

“读提交(Read Committed)”能预防啥?使用“快照读(Snapshot Read)”方式,避免“脏读”,但是可能出现“不可重复读”和“幻读”。

“可重复读(Repeated Red)”能预防啥?使用“快照读(Snapshot Read)”方式,锁住被读取记录,避免出现“脏读”、“不可重复读”,但是可能出现“幻读”。

“串行化(Serializable)”能预防啥?有效避免“脏读”、“不可重复读”、“幻读”,不过运行效率奇差。

好了,锁说完了,但是,我们的数据库锁,并不能有效的解决并发的问题,只是尽可能保证数据的一致性,当并发量特别大时,数据库还是容易扛不住。那解决数据并发的另一个手段就是,尽可能的提高处理的速度。

因为数据的IO要提升难度比较大,那么通过其他的方式,对数据进行处理,减少数据库的IO,就是提高并发能力的有效手段了。

最有效的一种方式就是:缓存

想要减少并发出现的概率,那么读写的效率越高,读写的执行时间越短,自然数据并发的可能性就变小了,并发性能也有提高了。

还是用刚才的秒杀举例,我们为的就是保证库存的数据不出错,卖出一个商品,减一个库存,那么,我们就可以将库存放在内存中进行处理。这样,就能够保证库存有序的及时扣减,并且不出现问题。这样,我们的数据库的写操作也变少了,执行效率也就大大提高了。

当然,常用的分布式缓存方式有:Redis和Memcache,Redis可以持久化到硬盘,而Memcache不行,应该怎么选择,就看具体的使用场景了。

当然,缓存毕竟使用的范围有限,很多的数据我们还是必须持久化到硬盘中,那我们就需要提高数据库的IO能力,这样避免一个线程执行时间太长,造成线程的阻塞。

那么,读写分离就是另一种有效的方式了

当我们的写成为了瓶颈的时候,读写分离就是一种可以选择的方式了。

我们的读库就只需要执行读,写库就只需要执行写,把读的压力从主库中分离出去,让主库的资源只是用来保证写的效率,从而提高写操作的性能。

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

由秒杀引发的一个问题

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

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

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

为何?

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

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

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

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

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

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

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

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

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

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

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

如何防止超卖

防止超卖唯一的方法就是理性消费,不要按着商家的步骤来买东西,就不会超卖。

oracle函数returnsys_refcursor怎么报错

热门频道

首页

博客

研修院

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:=0; selectavg(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

分享


网站题目:mysql怎么防止超卖 如何防止mysql数据库攻击
文章源于:http://cdxtjz.cn/article/dogdgeh.html

其他资讯