User u = userMapper.selectOne(id);
u.setName(myname);
u.setAge(myAge);
userMapper.updateById(u);
我看工作里面很多代码都是这样更新的,虽然方便但是有并发问题,大佬们 cr 遇到会打回去吗?
1
kanepan19 3 小时 13 分钟前
看场景,订单这样去更新要被批。
用户这样更无所谓。 |
2
ncbdwss 3 小时 4 分钟前
绝对不允许。
|
3
KongLiu 3 小时 4 分钟前
并发问题,建议加上乐观锁
|
4
SingeeKing 3 小时 2 分钟前 via iPhone
不懂 java ,但为啥这样会有并发问题?按我的理解 u 是 select 返回的,updateById 的过程才会创建 transaction 并 commit ,理论上 u 不共享不会出并发问题?
|
5
MooRider 2 小时 24 分钟前
@SingeeKing #4 第一个请求还没完成的时候第二个请求进来了, 由于一些原因导致第二个请求比第一个快, 最后的结果就变成了保存第一个请求的值
|
6
sduoduo233 2 小时 24 分钟前 via Android
@SingeeKing 我也不懂 java ,但是我觉得如果在 select 和 update 之间 user 的某一项数据更新了,会被 update 覆盖
|
8
pelloz 1 小时 56 分钟前 1
看场景,没要求的位置这么写没问题,写完赶紧下班。有要求的位置简单加一个事务,赶紧下班。对性能有影响了?那就改为乐观锁,改完下班。
|
9
crysislinux 1 小时 53 分钟前 via Android
所以你们的每个表都有类似 version 字段的东西么,实践中很少这样吧,我看到的绝大部分更新都是这样更的。
|
10
gadfly3173 1 小时 50 分钟前
理论上最好每次只更新自己的字段,但是那样写真的很麻烦吧。要通用的话你就得改造你的 DO ,让他能检测自己被改变了什么字段。
|
11
csys 1 小时 49 分钟前
真要说起来,这才是“正确”的(或者说是现代的)写法,前提是有乐观锁或者分布式锁
业务系统用数据库事务来做并发控制是个很不好的做法 参考 DDD 中的 repository 和 unit of work 模式 https://martinfowler.com/eaaCatalog/repository.html https://martinfowler.com/eaaCatalog/unitOfWork.html |
12
user8341 1 小时 18 分钟前
用户资料(姓名、年龄)不就是他自己一个人会更改吗?应该不会有并发问题。
|
13
dcsuibian 37 分钟前 via Android
并发你这后端改了也没啥用
实际上最有可能出现的并发问题不在这两行之间。而是前端的问题 比如 1 、甲打开了网页,拿到了 a 和 b 和两个字段,然后就去忙别的去了 2 、乙也打开了网页,拿到了 a 和 b ,然后把 b 修改成 b1 ,接着把 a 和 b1 一起提交上去 3 、甲回来了,把 a 修改成了 a1 ,然后把 a1 和 b 一起提交上去了 4 、最终就输 a1 和 b ,b1 的修改丢失了 正常前端都不会只传变更了的字段,而是偷懒一股脑都传上来 所以你后端其实根本判断不了 不过这其实也没啥大问题,因为通常来说一个表单的正确性就是取决于最后修改他的人而已 既然最后修改他的人觉得没问题,那其实也确实没啥大问题 |