V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Niner
V2EX  ›  Java

update 大家会允许这样写吗?

  •  
  •   Niner · 3 小时 20 分钟前 · 584 次点击
    User u = userMapper.selectOne(id);
    u.setName(myname);
    u.setAge(myAge);
    userMapper.updateById(u);
    

    我看工作里面很多代码都是这样更新的,虽然方便但是有并发问题,大佬们 cr 遇到会打回去吗?

    13 条回复    2025-01-23 01:30:52 +08:00
    kanepan19
        1
    kanepan19  
       3 小时 13 分钟前
    看场景,订单这样去更新要被批。
    用户这样更无所谓。
    ncbdwss
        2
    ncbdwss  
       3 小时 4 分钟前
    绝对不允许。
    KongLiu
        3
    KongLiu  
       3 小时 4 分钟前
    并发问题,建议加上乐观锁
    SingeeKing
        4
    SingeeKing  
       3 小时 2 分钟前 via iPhone
    不懂 java ,但为啥这样会有并发问题?按我的理解 u 是 select 返回的,updateById 的过程才会创建 transaction 并 commit ,理论上 u 不共享不会出并发问题?
    MooRider
        5
    MooRider  
       2 小时 24 分钟前
    @SingeeKing #4 第一个请求还没完成的时候第二个请求进来了, 由于一些原因导致第二个请求比第一个快, 最后的结果就变成了保存第一个请求的值
    sduoduo233
        6
    sduoduo233  
       2 小时 24 分钟前 via Android
    @SingeeKing 我也不懂 java ,但是我觉得如果在 select 和 update 之间 user 的某一项数据更新了,会被 update 覆盖
    zhouhu
        7
    zhouhu  
       2 小时 2 分钟前
    @kanepan19 大佬
    pelloz
        8
    pelloz  
       1 小时 56 分钟前   ❤️ 1
    看场景,没要求的位置这么写没问题,写完赶紧下班。有要求的位置简单加一个事务,赶紧下班。对性能有影响了?那就改为乐观锁,改完下班。
    crysislinux
        9
    crysislinux  
       1 小时 53 分钟前 via Android
    所以你们的每个表都有类似 version 字段的东西么,实践中很少这样吧,我看到的绝大部分更新都是这样更的。
    gadfly3173
        10
    gadfly3173  
       1 小时 50 分钟前
    理论上最好每次只更新自己的字段,但是那样写真的很麻烦吧。要通用的话你就得改造你的 DO ,让他能检测自己被改变了什么字段。
    csys
        11
    csys  
       1 小时 49 分钟前
    真要说起来,这才是“正确”的(或者说是现代的)写法,前提是有乐观锁或者分布式锁

    业务系统用数据库事务来做并发控制是个很不好的做法

    参考 DDD 中的 repository 和 unit of work 模式

    https://martinfowler.com/eaaCatalog/repository.html
    https://martinfowler.com/eaaCatalog/unitOfWork.html
    user8341
        12
    user8341  
       1 小时 18 分钟前
    用户资料(姓名、年龄)不就是他自己一个人会更改吗?应该不会有并发问题。
    dcsuibian
        13
    dcsuibian  
       37 分钟前 via Android
    并发你这后端改了也没啥用

    实际上最有可能出现的并发问题不在这两行之间。而是前端的问题
    比如
    1 、甲打开了网页,拿到了 a 和 b 和两个字段,然后就去忙别的去了
    2 、乙也打开了网页,拿到了 a 和 b ,然后把 b 修改成 b1 ,接着把 a 和 b1 一起提交上去
    3 、甲回来了,把 a 修改成了 a1 ,然后把 a1 和 b 一起提交上去了
    4 、最终就输 a1 和 b ,b1 的修改丢失了

    正常前端都不会只传变更了的字段,而是偷懒一股脑都传上来
    所以你后端其实根本判断不了

    不过这其实也没啥大问题,因为通常来说一个表单的正确性就是取决于最后修改他的人而已
    既然最后修改他的人觉得没问题,那其实也确实没啥大问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1196 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:08 · PVG 02:08 · LAX 10:08 · JFK 13:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.