吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1567|回复: 64
收起左侧

[求助] 为了防止多人同时修改数据库中一行数据,一般采用什么做法

  [复制链接]
ilovecomputer66 发表于 2024-3-18 10:41
具体是:比如一个表是汇总各个车间每日生产总数的,不同车间会生产相同的

具体字段为

id | 日期 |   零件A总产量 | 零件B总产量 | ………………

每天快下班前,由各个车间的管理员统计然后上传

首先,如果每个车间加上自己车间的数量时,都是update  a_count = a_count+ 具体产量   这样的SQL肯定不会冲突

但我想求知,如果不用这种方式,而就是update为具体数值,怎么避免冲突? 比如 今日原始产量都是0, 1车间生产A10个,B10个, 2车间生成A5个,B 5个

如果正常不冲突时,1车间先获取表中数据都是0,然后update加上自己变成 10  10  ,  然后2车间才打开软件,先获取现在产量是 10 10 ,然后加上自己的变 15 15 ,这是对的

但万一,它俩车间都打开软件,获取的初始都是0,然后这时 分别提交,那么后提交的肯定就把前面的覆盖了


——————————————
请问一般怎么解决,这个问题


我能想到的办法是如下的,不知道我这个办法就是大家实际使用的,还是我这个方法很山寨,请提供正常的嘴阀

我的做法
增加一个列,记录该条数据被修改的版本数(自增),提交时,SQL 语句 会where  version = 之前自己加载数据时的,如果能修改,说明自己提交时,数据没别其他人改过,就可以直接改。否则不满足where修改不了任何一行,这时,客户端就可以主动获取最新version的数据,然后重新加上自己生产的进行提交

免费评分

参与人数 1热心值 +1 收起 理由
Xiu0529 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bhbhxy 发表于 2024-3-18 10:46
我一个外行都知道数据库可以lock
醉红尘0 发表于 2024-3-18 10:48
我一般是客户端上传的数据单独一个表(假定叫车间产量表),每次上传新增一条记录(可以设定每个车间每天只能新增一条记录,第二次及以后上传,更新已有记录)。然后总产量的表,用定时任务从车间产量表里面提取当天的数据统计后写入总产量的表中。
yk2014 发表于 2024-3-18 10:52
我的建议是不要弄总产量表,想要获取总数据时,直接获取每个表的数据,在软件中自己相加
lyshy 发表于 2024-3-18 10:52
1、我们日常做法是增加一个时间戳字段,每次更新的时候需要从页面带上时间戳,和你说的做法类似。
2、我之前解决过一个并发的问题,使用的是for update语句查询,带上where就是行级锁,这样可以避免并发同时修改的问题。
数据库更新:当数据库中某些记录需要进行修改、删除或插入时,可以使用For Update锁定这些记录,以确保数据操作的正确性和一致性。
for update适用场景:
并发控制:在并发访问情况下,多个线程可能会同时读取和写入同一份数据,使用For Update可以避免并发问题,保证数据的完整性和准确性。
事务处理:在事务中,For Update可以确保对共享资源的互斥访问,防止出现数据不一致的情况。
缓存更新:使用For Update可以在缓存中更新数据,保证在多个进程或线程中操作缓存时的数据一致性。
悲观锁控制:For Update是一种悲观锁控制方法,可以确保在对共享资源进行操作前,先将其锁定,以防止其他线程对其修改。
jituidadada 发表于 2024-3-18 10:53
这个是乐观锁吧?
twshe 发表于 2024-3-18 10:53
不加一列吗?车间ID列
 楼主| ilovecomputer66 发表于 2024-3-18 10:54
bhbhxy 发表于 2024-3-18 10:46
我一个外行都知道数据库可以lock

你在搞笑? 用户A 今天早上7点打开准备提交,就lock,然后他下班才提交。然后这期间,其他人都不能修改了额?
 楼主| ilovecomputer66 发表于 2024-3-18 10:55
yk2014 发表于 2024-3-18 10:52
我的建议是不要弄总产量表,想要获取总数据时,直接获取每个表的数据,在软件中自己相加

我只是为了用个例子说明这个大致情况。但实际上不是这个例子,因为每天产生数据太巨量。所以,每次获取时统计,最终的花费时间,不被评审通过,所以,没用实时计算
鹏路翱翔 发表于 2024-3-18 10:56
用中间件,数据库内容发生改变,你要实时展示给每个用户,
用户修改内容的时候,也要进行鉴权,防止同时修改。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 17:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表