线程安全和表单提交的疑问

predisw 2015-07-30 06:34:42
现在在做一个项目,遇到一个比较困惑的地方. 项目使用spring mvc + tomcat . 问题如下:
例如 需要对一个客户A 的备注进行更新.在jsp 页面上显示A 的资料(从数据库中读取出来,放到jsp 对应的form 中),包括已存在的备注信息,如 "AA". 员工B 和 员工C 都打开这个jsp 页面,也就是说都从数据库读出了A 的资料.
员工B 修改备注为"AABB",然后提交,写入数据库.而员工C 也修改该备注为"AACC",然后提交,时间上只是比B 慢一点.
结果是 员工B 修改的备注被修覆盖掉了,只显示为"AACC" 了.
有没有方法让员工B 修改备注的时候,员工C 无法修改呢??
查看资料,看到解决线程同步的方法是 获取和更新信息 都放到同一个synchronized块中,这样不同的线程不能同时获取信息,才避免了线程安全的问题.
而我上面的那个问题,是获取 和 更新分开,没办法合并在一起......;在日志中也看到一个请求产生一个线程.读取 和 更新 是两个独立的请求,各自生成一个线程.如果给读取 和 更新 都添加synchronized ,员工C 读取的线程会在员工B读取线程结束后再读取也一样,相当于没有效果.

或者说不是线程同步的问题?而是功能设计的问题?功能设计的不好导致出现这个问题的?
感谢各位提出建议.非常感谢!
...全文
148 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
predisw 2015-08-03
  • 打赏
  • 举报
回复
感谢各位的帮助.我将分平均给了4 楼和9楼. 5楼和6楼我觉得也是可以的,但是4楼先回复,所以分给了4楼;9楼给出了通用的解决方案和专有的术语名词,我可以通过百度了解更多的相关内容,所有也给了9楼分. 再次谢谢各位的回复.
peter_xizi 2015-07-31
  • 打赏
  • 举报
回复
嗯,可以利用CompareAndSet方式, 大多线程并发实战中也提到了这种方式实现线程安全性
  • 打赏
  • 举报
回复
数据➕version限制
come_qian 2015-07-31
  • 打赏
  • 举报
回复
把读取和修改分开就可以实现了。 update 表 set 备注=备注+新值 where id=id 这是根据你的需求改的。如果备注中间加入就使用锁行进行解决了(给个状态,别人正在编辑,不允许别人编辑)。
sina_wjz 2015-07-31
  • 打赏
  • 举报
回复
引用 3 楼 predisw 的回复:
[quote=引用 2 楼 bichir 的回复:] 这不是线程安全问题,你这是设计问题。如果想达到你那效果就可以在保存的时候再查一遍数据库,对比一下原数据就行了。
如果这样做的话,实现起来非常麻烦: 1.需要在jsp 页面保留读取出来的值AA,然后用一个新input,有新的name,和value 值来保存更新的值AA_NEW. 2.提交到action,先比较jsp 页面保留值AA 和数据库值的值是否一致,如果不一致则抛出异常,如果一致才将 AA_NEW 写入数据库. 也需要在action 处添加synchronized,保证比较AA 和数据库的值时,不会被其他线程修改. 问题是: 假如需要更新的字段有很多,那么不是要判断很多次吗?要每个字段都需要比较. 这样太麻烦了,我相信有更加简洁的方法.当然这是我的实现方法,不知有没有其他的方案? 谢谢你的回答! [/quote] 有多个字段的话可以在数据库表中加一个字段,用来标识是否已被修改,每次跟新前先比较这个字段,一样的话执行更新,不一样就抛出异常,每次更新完之后就更新这个字段
predisw 2015-07-31
  • 打赏
  • 举报
回复
引用 2 楼 bichir 的回复:
这不是线程安全问题,你这是设计问题。如果想达到你那效果就可以在保存的时候再查一遍数据库,对比一下原数据就行了。
如果这样做的话,实现起来非常麻烦: 1.需要在jsp 页面保留读取出来的值AA,然后用一个新input,有新的name,和value 值来保存更新的值AA_NEW. 2.提交到action,先比较jsp 页面保留值AA 和数据库值的值是否一致,如果不一致则抛出异常,如果一致才将 AA_NEW 写入数据库. 也需要在action 处添加synchronized,保证比较AA 和数据库的值时,不会被其他线程修改. 问题是: 假如需要更新的字段有很多,那么不是要判断很多次吗?要每个字段都需要比较. 这样太麻烦了,我相信有更加简洁的方法.当然这是我的实现方法,不知有没有其他的方案? 谢谢你的回答!
bichir 2015-07-30
  • 打赏
  • 举报
回复
这不是线程安全问题,你这是设计问题。如果想达到你那效果就可以在保存的时候再查一遍数据库,对比一下原数据就行了。
predisw 2015-07-30
  • 打赏
  • 举报
回复
自己给自己打个气

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧