Experience 数据库脏读

本文探讨了在浏览器应用程序和数据库交互过程中出现的脏读问题,包括单条数据及批量数据更新时如何避免脏读现象,提出了通过增加锁字段等方式来解决并发更新冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Experience 数据库脏读

[size=medium][color=blue]脏数据[/color][/size]
[color=blue]浏览器 应用程序+数据库[/color]

对数据库进行更新操作,除了异常之外还有更新不成功,就是条件查询的时候没有查询到数据

[color=blue]一 浏览器 应用程序[/color]

1 A和B把数据都读出来了,A对数据进行了更新并提交成功了
这个时候B看到的数据跟数据库里的不一致,但是B这个时候
也对数据进行更新,程序设计的时候应该不能让B更新成功
并给出提示信息更新失败,这个之前已经说过在表上加字段
可以解决这个问题。

1.1 上面这种情况只是对单条数据进行的操作
如果有多条数据同时更新怎么办,有的数据更新成功了,有的数据没有更新成功
例如,给一个团队分配多个用户的时候
A,B都把用户给查询出来了,A给团队p分了10个人 ,B给团队分了 20个人 有重复了
A先提交,用for循环进行更新每个人的团队状态字段
这个时候B提交会覆盖掉A的数据,所以会出现问题

怎么解决,还是用上面的方法在用户表里加lock字段更新做+1操作
由于是for循环更新不是batch更新所以可以记录哪些数据返回的是1,哪些返回的是0
返回时0的可以封装起来,返回到前台,用于显示哪些更新失败了。

如果采用这种方式,那么团队人数的数量,是更新成功之后的数量,并不是传进来的
20人就20人。

如果是batch处理的话,两处操作,那么只能返回更新成功的条数。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[color=blue]二 数据库[/color]

2 A正在更新数据,B正在读数据,两个动作同时进行
例如A正在置a1这条记录的删除状态为1,但是事物并没有提交
这个时候B正在读a1这条记录,
如果B这个时候读出了这条数据且B更新事物成功了
那么B这个时候就不应该显示出这条数据,与数据库不一致了,脏读了。
如果A回滚了还好说点,是正确的
(oracle默认的是不可提交读,就是读的是之前的数据?)

这种情况怎么处理?
这个就要用事物来进行控制了,表设计和程序是控制不了的
当B对数据进行更新的时候,应该锁定这条数据,等B更新完
事物提交或者回滚后,A才可以读出这条数据,B未提交之前A一致处在
等待状态。
具体怎么做? 看spring事物控制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值