Bootstrap

高并发状态下修改数据库的操作

  在高并发状态下,尤其数据在频繁修改的状态下,很可能出现脏数据,也有可能造成脏读,不可重复读等问题,那么怎么解决这种问题呢,其实解决方式有很多中,我们探讨出来的结果是,在频繁修改的表里面添加一个时间戳或者随机数的字段,例如,timestamp。

  原理是当每一次修改数据的时候都要把之前的时间戳修改成当前的时间戳,并且之前的时间戳要作为where条件,如果之前的时间戳和参数里面的时间戳不一致,则修改失败,在重新查询进行反复操作,上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
try  {
  if  (count> 5 ) {
    return  "" ;
  }
  Serialize serialize = serializeManager.queryByType(serviceType);
      if  (serialize!= null ) {
      Serialize serializeUpdate =  new  Serialize();
      serializeUpdate.setId(serialize.getId());
      serializeUpdate.setRandomCode(serialize.getRandomCode());
      serializeUpdate.setRandomCodeNew(UUID.randomUUID().toString());
      serializeUpdate.setSerializeStart(serialize.getSerializeStart()+ 1 );
      boolean  flag = serializeManager.updateByRandom(serializeUpdate);
      if  (flag) {
          return  serialize.getSerializeCode()+(serialize.getSerializeStart()+ 1 );
      } else  {
        count++;
         return  getCode(serviceType,count);
      }
  } else  {
    return  "" ;
  }
catch  (Exception e) {
  e.printStackTrace();
  return  "" ;
}

流程:1.首先查询出来当前信息,

            2.根据之前的随机码并作为修改时候的条件

            3.修改新生成的随机码,如果修改失败,则递归调用一次本方法。直到成功。










本文转自 xinsir999 51CTO博客,原文链接:http://blog.51cto.com/xinsir/1864866,如需转载请自行联系原作者
;