当前位置:首页 » 数据仓库 » 数据库并发操作会出现什么问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库并发操作会出现什么问题

发布时间: 2023-05-16 18:26:56

1. 并发操作可能会产生哪些问题

编辑可能需要比较长的时间,
建议不锁定,而在每次更新数据库的时候,比较一下,如果和刚开始取出来的
不一样,则提示,或者打开新的副本;让选择;

可能需要增加一个字段保存最后更新时间
时间上可能受不了!系统时间要求很高
并发问题
如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括:
丢失或覆盖更新。
未确认的相关性(脏读)。
不一致的分析(非重复读)。
幻像读。
丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

例如,两个编辑人员制作了同一文档的电子复本。每个编辑人员独立地更改其复本,然后保存更改后的复本,这样就覆盖了原始文档。最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则可以避免该问题。

未确认的相关性(脏读)
当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

例如,一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该复本包含到目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前任何人都不能读取更改的文档,则可以避免该问题。

不一致的分析(非重复读)
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。

例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

幻像读
当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

从上面可以看到,解决并发主要是用到了锁和事务。
锁 :给记录或表加上锁是为了对当前操作对象加上一个状态表示位,
让其它用户在获取编辑权限时有了判断。
事务:是为了保证一组操作的完整性。

一般处理并发问题的做法:
1.开启事务
2.申请写权限,也就是给对象(表或记录)加锁.
3.如果失败,则结束事务,过一会重试。
4.如果成功,也就是给对象加锁成功,防止其它用户再用同样的方式打开。
5.进行编辑操作
6.写入所进行的编辑结果
7.如果写入成功,则提交事务,完成操作。
8.如果写入失败,则回滚事务,取消提交。
9.(7.8)两步操作已释放了锁定的对象,恢复到操作前的状态。

2. 数据库的并发操作可能带来的问题包括

数据库的并发操作可能带来的问题包括丢失更新,相关知识介绍如下:

一、数据库的介绍:

1、数据库是“按照数据结构来组织、存储和管理数据的仓库弯饥”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

2、数据库管理系统是数据库系统的核心组成部分,主要完成简闹尺对数据库的操作与管理功能,实现数据库对象的创建、数据库存储数据的查询添加修改与删除操作和数据库的用户管理权限管理等。它的安全直接关系到整个数据库系统的安全。

3. 如何处理数据库并发问题

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

什么是数据并发操作呢?
就是同一时间内,不同的线程同时对一条数据进行读写操作。

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

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

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

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

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

4. 并发操作带来哪三个问题

丢失更新、不可重复读、读脏数据。并春如发操作当一个线程对共享变量操作到一半时,另外的线程也有几率来操作共享变量,干扰了前一个线程的操作会导致带来丢失更新、不可扒唤启重复读、读脏数据三个问题风险。可以使用封锁技术,这是实现并发控制的一个非常重链丛要的技术,所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。

5. 并发操作会带来哪些数据不一致性

1.丢失修改:当两个或多个事务选择同一数据,并且基于最初选定的值修改该数据时,会发生丢失修改问题。
2.脏读:当一个事务正在访问数据春局,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据。
3.不可重复读:一个事务重新读取前面读取过的数据,发现该扒枯让数据已经被另一个已提交的事务修改过。即事务1读取某一数据后,事务2对其做了修改,败带当事务1再次读数据时,得到的与第一次不同的值。在一个事务中前后两次读取的结果并不致,导致了不可重复读。