情形如下:
张三 20 男
张三 25 男
保存张三 20 女
保存如此, A 的信息被覆盖了
谢谢大家啦!
谢谢大家啦, 结合大家的答案我再考虑下。 非常感谢大家!!!!
1
iMouseWu 2016-04-07 10:15:28 +08:00
乐观锁可以解决吧
|
2
amlun 2016-04-07 10:18:01 +08:00
没有看出数据不一致。。
如果是防止同时更改,可以对该条数据加锁啊 |
3
shoaly 2016-04-07 10:19:48 +08:00
这个不是锁能够搞定的, 而是程序逻辑的问题.
A 改动的是 年龄 B 改动的是性别 两个操作本身不冲突的, 现在冲突是因为 代码修改的是全部... 解决办法 只保存 要修改的那一个字段, 不要都修改. |
4
hp3325 2016-04-07 10:20:12 +08:00
你可以加个时间戳, A 保存时更新时间戳, B 保存时获取时间戳,对比是否更新过,如果更新过,提示用户。
甚至可以用存储过程,让数据库自动保证数据一致。 |
5
UnisandK 2016-04-07 10:21:17 +08:00
3L+1
|
6
qiyuey 2016-04-07 10:23:16 +08:00
这确实是程序的问题
|
7
Jaylee 2016-04-07 10:24:02 +08:00
你知道锁吗?
|
8
shiny 2016-04-07 10:25:36 +08:00
SELECT FOR UPDATE
|
9
shiny 2016-04-07 10:27:00 +08:00
保存前检查数据是否为修改前的数据
|
10
Infernalzero 2016-04-07 10:39:44 +08:00
LZ 的问题不在于加不加锁,关键是都用了全量更新
所以为了避免这种情况都是只更新修改的字段,非空字段不更新 不要拿查询出来的对象去更新,而是 new 一个新的对象仅把之前查询出来的对象的主键 set 进去 |
11
yangdehua 2016-04-07 10:56:00 +08:00
事务隔离级别设置为, serializable
连读都加锁,你说好不好啊 |
12
loading 2016-04-07 11:03:05 +08:00 via Android
锁解决不了。
前台只提交更改的就行。 如果可以,考虑下 websock 实时更新并提醒。 |
14
amlun 2016-04-07 11:08:32 +08:00
所以题主---表达清楚需求啊!
|
15
gamexg 2016-04-07 11:17:06 +08:00
|
16
likuku 2016-04-07 11:24:02 +08:00
性别如今也不是不能改的...要政治正确啊。参考 FaceBook
|
17
Numbcoder 2016-04-07 11:25:06 +08:00
用 etag
A , B 在读取信息时,保存信息的 etag , 然后在发送更新请求时带上 etag ,执行数据库更新操作前检查 etag 是否变化,如果 etag 一致,保存更新,否则更新失败 |
18
jugelizi 2016-04-07 11:49:43 +08:00
这还叫并发 。。
难道修改不应该保存修改记录吗? redis 好像有原子操作更新数据前检测数据有没有变化过 |
19
yxzblue 2016-04-07 11:57:01 +08:00
难道不是 1L 说的乐观锁就解决了么 ...
|
20
yanyuan2046 2016-04-07 12:12:30 +08:00
SELECT FOR UPDATE +1
|
21
yanyuan2046 2016-04-07 12:16:54 +08:00
说具体一下:
看需求,并发修改同一行数据, 如果期望 B 操作无效,用乐观锁 如果期望按时间顺序执行( B 也会执行),用 select for update |
22
WangYanjie 2016-04-07 12:58:11 +08:00
你真的希望 A , B 的操作都生效吗?感觉会是一场灾难
|
23
msg7086 2016-04-07 13:11:01 +08:00
两种场景。
1. 单字段更新。写入数据库的时候只写入脏数据,这样就不会撤销之前的更改。 2. 完整对象更新。如 13 楼所说,确实有按照 B 的修改完整写入的需求。 |
24
david2016 2016-04-07 13:48:31 +08:00
如果是 innodb 存储引擎的表的话,在这种并发写的情况下:
两种决定因素: 1 )事物隔离级别是哪种 2 ) update 更新数据时候 where 查询条件列是否有索引,有的话是主键 /唯一 /非唯一索引 |
25
whahuzhihao 2016-04-07 14:04:16 +08:00
select for update 可以吧,一个人在操作一条数据的时候,另外一个连读这条数据的权限都不给
|
26
Lullaby 2016-04-07 14:27:15 +08:00
3L 真是目光如炬
|