问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

试述并发操作隐含的数据不一致性问题

发布网友 发布时间:2022-05-01 05:32

我来回答

2个回答

懂视网 时间:2022-05-07 00:40

最近做的《选修课系统》需要考虑这样一个问题:数据库的并发操作带来的数据库数据不一致问题因为是全校性选修课,同一时间点大批学生选课,那么必然存在多名学生同时对同一数据进行操作是的问题,如果这种并发操作不加以控制的话,必会造成数据的不一致。 一

最近做的《选修课系统》需要考虑这样一个问题:数据库的并发操作带来的数据库数据不一致问题——因为是全校性选修课,同一时间点大批学生选课,那么必然存在多名学生同时对同一数据进行操作是的问题,如果这种并发操作不加以控制的话,必会造成数据的不一致。

一直知道有这种问题,并且知道这种问题的解决方法——加锁;但是有些东西之前了解的并不是很透彻,于是好好研究了一天,觉得理解的还可以,先总结一部分。

1,什么是并发操作?

数据库的一个重要特征是:支持数据共享,也就是说允许多个用户程序并行地存取数据库中的数据;那么,多用户或多事物可能同时对同一数据进行操作,这成为并发操作。

2,并发操作可能带来的影响?

如果不对并发操作进行控制的话,那么就会存取不正确的数据,破坏数据的完整性。——为什么这么说?下面进行介绍

在此之前,先说一下事务的概念。

3,什么是事务?

对一件完整的事儿,要么做完整,要么都不做。例如:学生选课—学生选上课时,需要将选课信息写入选课表的同时,更新课程表中的课程余量;如果在添加选课信息时,中断了(不能进行余量更新),那么就会事务回滚,即,数据回滚到没选课之前。

Begin Transaction

选课表中添加选课信息;

更新课程表中的课程余量;

Commit

RollBac

事务的SQL语句:

Begin Transaction开始事务

Commit提交事务

RollBack回滚

(注:事务中的多条SQL语句也是一条条执行的,当所有语句执行完后,提交事务,如果其中一条中断,则事务回滚所有操作回到语句执行之前)

事务的并发主要是为了提高效率,但是,同时它也带来了一定问题

4,并发操作带来的问题?

之前讲过并发操作——多用户或多事务同时对同一数据进行操作;

因为事务中的语句也是一条条执行的,所以存在多用户多事务同时对同一数据进行操作的情况;

并发操作带来的问题:

(1)丢失修改

(2)脏读

(3)不可重复读

4.1丢失修改

当两个或多个事务(或两个或多个用户)选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在(或每个用户操作时并不会考虑同一时刻是否有别的用户进行着同样的操作)。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。  

例子1:事务T1,事务T2,数据库中数据R=1000

a.t1时刻,事务T1读取R=1000;

b.过了一会儿 t2时刻,事务T2读取R=1000;

c.t3时刻,事务T1修改R=R-200(那么R=800)写入数据库(此时,数据库中R=800);

d.过了一会儿 t4时刻,事务T2修改R=R-100(因为在t2时刻读到的数据为R=1000,那么修改后R=900)写入数据库(此时,数据库中R=900)

那么最终,数据库中R=900;数据对吗?当然不对,因为T1、T2分别对R进行了-200 -100操作,最终数据应为R=700;事务T2的修改覆盖了T1的修改 ——丢失修改问题

例子2:选课:学生A、学生B、课程1的余量=20

a.学生A选择课程1时,先读出课程余量20

b.然而同一时刻(也可是不同时刻,只要在学生A更新数据之前),学生B也读出了课程1的余量20,

c.学生A选择此课程,课程1余量-1,写入数据库,此时课程1的余量=19;

d.学生B选择此课程,课程1余量-1(因为之前读出的课程1余量为20,-1后为19),写入数据库,此时课程1的余量=19;

课程余量=19 数据正确吗?不正确。实际情况课程余量应更新为18;——B的修改覆盖了A的修改 —— 丢失修改问题。

解决办法:加锁,只允许并发一个更新事务。

4.2脏读

当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,

另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个

事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

例子1:事务T1,事务T2,数据库中数据R=1000;

T1:

Begin Transaction开始事务T1

ReadR=1000;(1)

R=R-200;(2)此时R=800

R=R+100;(3)此时R=900

Commit提交事务T1

a.当事务T1进行到第(2)后,即,数据库中的数据R=800时;

b.事务T2开始读R的值,读出的值为R=800;但此时事务T1还没有进行完整,还未提交事务;

c.之后事务T1进行第(3)步R=R+100,此时R=900 事务T1提交,此时数据库中R=900;

那么在事务T1提交事务之前,事务T2读出的数据(R=800)为脏数据;

例子2:

a.张三的工资为2000,元老板把张三的工资改为了8000元(但未提交事务)

2.张三查看自己的工资 ,发现工资变为了8000元

3.而后老板发现改错了,回滚了事务,张三的工资又变回了2000元

那么,张三读取的工资8000元就是脏数据。

解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

4.3不可重复读

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

在一个事务中前后两次读取的结果并不致,导致了不可重复读。

例子1:事务T1、事务T2、张三的工资=1000

a.事务T1中,张三读取了自己的工资为1000元,操作并没有完成

b.此时(事务T1读取了张三工资为1000元)事务2中,修改了张三的工资为2000元,并提交了事务.

c.此时(事务T1读取了张三工资为1000元,事务T2修改了张三的工资为2000元)在事务1中,张三再次读取自己的工资时,工资变为了2000

那么,同一个事务中,前后读取的数据不一致 —— 不可重复读问题。

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

总结:

(1)事务的并发主要是为了提高效率,但是,同时它也带来了一定问题——丢失修改、读脏数据、不可重复读

(2)结合生活中实例,理解丢失修改、读脏数据、不可重复读问题。

个人理解,如果哪里有理解偏差,忘纠正!

下篇博客会总结“锁”的概念,并解释“锁”是如何解决并发造成的数据不一致问题。

热心网友 时间:2022-05-06 21:48

脏读 dirty reads:就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
不可重复的读 non-repeatable reads:不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
幻觉读 phantom read:幻觉读是指当事务不是独立执行时发生的一种现象,例如 第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 大家介绍一下有什么伤感铃声给我当来电铃声么? 如何保持数据库的并发性和一致性 并发操作会带来哪些数据不一致性.a,丢失修改,不可重复读,读脏数据... 黄景瑜热巴电视剧叫什么? 并发操作会带来哪些数据不一致性 网曝黄景瑜探班迪丽热巴,这是恋情实锤了吗? 数据库的并发操作可能带来哪些问题 丢失更新 死锁 违反唯一性约束 迪丽热巴和黄景瑜用同个保镖,难道他们是情侣? 热巴黄景瑜共用保镖!这是恋情曝光还是工作需要? 热巴黄景瑜被扒共用一个保镖,你觉得他们两个会走到一起吗? 迪丽热巴黄景瑜同用一个保镖,是巧合还是在一起了? 共用保镖,前同事盖章:去年就定情了!迪丽热巴黄景瑜,谁在炒? 迪丽热巴黄景瑜同用一个保镖,他们之间的关系有多好? 什么是小寒节气? 迪丽热巴、黄景瑜同用一个保镖,他们这是在一起了吗? 用脆弱,懦弱,持之以恒,凝聚,光芒万丈,孤军奋战写一段以努力为主题的话,运用一种修辞手法 什么是小寒节气来历? 迪丽热巴、黄景瑜同用一个保镖,他们合作过吗? 小寒节气的含义是什么? 鲁抗医药股票建议合理定价区间是多少 求助各位网络歌手达人,帮我参谋下! 圣牧有机纯牛奶多少钱 天猫双十一是怎么保证高并发、分布式系统中,数据一致性的? 求好听的伤感手机铃声。 有没有好听的来电铃声,要悲伤一点的 天猫双十一是怎么保证高并发,分布式系统中,数据一致性的 谁能介绍几首伤感的来电铃声给我啊、谢谢 少女都市怎么买垃圾桶 谁有2010最新伤感来电铃声?多推荐几条啊。 悲伤的手机来电铃声 t1,t2并发执行能保证数据库的一致性吗,t1,t2并发执行会出现死锁吗 phpstudy自带mysql吗 求好听的伤感来电铃声,我是90后的! 分布式存储中,怎样使用paxos算法保证数据的一致性 有什么来电铃声伤感一点的 有没有朋友推荐几首手机来电铃声,伤感点得,清晰点的,大声点的,要女声得,谢谢了。 为什么说以异步方式执行的程序不适合大量的并发 一首伤感的手机铃声 求助~ 哪里能买到完全没塑料味的垃圾桶? [伤感 - 来电铃声] 在酷狗中这样搜索 这首歌是33秒 哪位大神告诉我这首歌的全名啊跪求