如何处理数据库并发问题

如何处理数据库并发问题,第1张

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

什么是数据并发 *** 作呢?

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

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

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

第一种方案、数据库锁

从锁的基本属性来说,可以分为两种:一种是共享锁(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能力,这样避免一个线程执行时间太长,造成线程的阻塞。

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

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

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

数据冗余指数据之间的重复,也可以说是同一数据存储在不同数据文件中的现象。可以说增加数据的独立性和减少数据冗余为企业范围信息资源管理和大规模信息系统获得成功的前提条件。

数据冗余会妨碍数据库中数据的完整性(integrality),也会造成存贮空间的浪费。尽可能地降低数据冗余度,是数据库设计的主要目标之一。关系模式的规范化理沦(以下称NF理论)的主要思想之一就是最小冗余原则,即规范化的关系模式在某种意义上应该冗余度最小。

但是,NF理论没有标准的概念可用,按等价原则,在有或没有泛关系假设(universal relation assumption)等不同前提下,冗余的定义可能有好几种。

数据的应用中为了某种目的采取数据冗余方式。

1、重复存储或传输数据以防止数据的丢失。

2、对数据进行冗余性的编码来防止数据的丢失、错误,并提供对错误数据进行反变换得到原始数据的功能。

3、为简化流程所造成额数据冗余。

4、为加快处理过程而将同一数据在不同地点存放。

5、为方便处理而使同一信息在不同地点有不同的表现形式。

6、大量数据的索引,一般在数据库中经常使用。

7、方法类的信息冗余。

8、为了完备性而配备的冗余数据。

9、规则性的冗余。根据法律、制度、规则等约束进行的。

10、为达到其他目的所进行的冗余。

1、数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。

2、数据库系统降低冗余度的方法:尽可能不重复,以最优方式为某个特定组织的多种应用服务;其数据结构独立于使用它的应用程序;数据的增、删、改和检索由统一软件进行管理和控制;从发展的历史看,数据库是数据管理的高级阶段,是由文件管理系统发展起来的。

3、数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。物理数据层:是数据库的最内层,是物理存贮设备上实际存储的数据的集合;概念数据层:是数据库的中间一层,是数据库的整体逻辑表示;逻辑数据层:逻辑记录的集合。


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

原文地址: http://outofmemory.cn/sjk/9629828.html

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

发表评论

登录后才能评论

评论列表(0条)

保存