2 xiaosuisky xiaosuisky 于 2016.09.23 21:27 提问

java项目,多台tomcat应用更新丢失 10C

假如有2台tomcat服务,现在同时对某条记录更新操作。具体业务逻辑如下:首先查询出某条记录的字段A的原始值为100,然后tomcat1需要给A字段加100,tomcat2需要给B字段加200,目标结果是A的最终结果值为400。但是会出现这么一类情况,tomcat1,tomcat2都已经完成查询A的值,即100,但是tomcat1更新后A的值为200,然后tomcat2去更新后A的值变为300,并不是最终我们需要的400,即更新丢失了。请问各位大侠这个问题怎么解决呢??

4个回答

oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.23 22:04

这个问题其实类似于银行账户之间的转账操作,需要对公共操作的数据加锁,防止出现数据丢失

参考下这篇文章:http://blog.csdn.net/gz2008gz/article/details/5398529

xiaosuisky
xiaosuisky 嗯,是有些类似银行转账的操作,但是具体怎么操作呢。
大约一年之前 回复
isunnyvinson
isunnyvinson   2016.09.23 22:24

如果使用hibernare框架,可以使用flush(),先清空缓存

xiaosuisky
xiaosuisky 没有用到hibernate
大约一年之前 回复
quasimodo_es
quasimodo_es   2016.09.24 16:25

这个并发的问题,一般加锁处理;
悲观所:数据库加锁,select 的时候加一下 for update,保证一个进程对数据进行操作;
乐观所:数据加版本号 version ,在代码逻辑中处理验证数据;
如果数据量比较少,一般悲观所就够了,

quasimodo_es
quasimodo_es 回复xiaosuisky: 那就要看你事物的隔离级别了
大约一年之前 回复
xiaosuisky
xiaosuisky 这个地方还用到事务了,事务是spring来控制的,业务类没有执行完,tomcat1的更新就不是真正意义上的更新了。
大约一年之前 回复
fu415037685
fu415037685   2016.09.24 16:45

线程问题吧,需要给每个步骤加上锁

xiaosuisky
xiaosuisky 单服务的话可以通过锁来解决,这个是多服务的问题。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片