重复插入数据导致select one but find two的问题

 1 public Map<String,Object> getDormitoryStorageListByAgentId(int agentId) {
 2         Map<String,Object> resultMap = new HashMap<String, Object>();
 3         //forDormitoryAgent
 4         List<DormitoryStorage> storageList = storageMapper.getDormitoryStorageListByAgentId(agentId);
 5         DormitoryStock stock = stockMapper.getCurrentDormitoryStockByAgentId(agentId);
 6         List<StorageModelForDormitory> storageModelList = new ArrayList<StorageModelForDormitory>();
 7         Iterator<DormitoryStorage> storageIt = storageList.iterator();
 8         while(storageIt.hasNext()) {
 9             StorageModelForDormitory storageModel = new StorageModelForDormitory();
10             DormitoryStorage storage = storageIt.next();
11             storageModel.setStorageId(storage.getId());
12             storageModel.setStoreLeft(storage.getNumber());
13             storageModel.setSnackName(storage.getSnack().getName());
14
15             int snackPlus = 0;
16             DormitoryStockSnack stockSnack = stockSnackMapper.getStockSnackByStorageId(stock.getId(), storage.getId());
17             if(stockSnack != null) {
18                 snackPlus = stockSnack.getNumber();
19             }
20             storageModel.setSnackPlus(snackPlus);
21             //尝试更新昨日销量
22             Date today = new Date();        //当前日期
23             Date lastStatisticsDay = storage.getStatisticsDay();
24             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
25             Date yestoday = new Date(new Date().getTime()-24*60*60*1000);
26             Integer oneDaySale = 0;
27             //如果最后购买日期不为空,为空的话
28             if(lastStatisticsDay != null) {
29                 //如果最后购买日期是今天,从统计表拿昨天。
30                 if(dateFormat.format(lastStatisticsDay).equals(dateFormat.format(today))) {
31                     StorageSaleStatistics statistics = new StorageSaleStatistics();
32                     statistics.setDay(yestoday);
33                     statistics.setStorageId(storage.getId());
34                     oneDaySale = statisticsMapper.getStorageOneDaySale(statistics);
35                     if(oneDaySale==null) {
36                         oneDaySale = 0;
37                     }
38                 }else {
39                     //如果最后购买不是今天,加入统计表,获取昨天销量,将最后购买日期(操作日期)设置为今天,购买量为0.
40                     //初始化最后一日销量,某个商品某日的销量是多少
41                     StorageSaleStatistics statistics = new StorageSaleStatistics();
42                     statistics.setStorageId(storage.getId());
43                     statistics.setOneDaySale(storage.getOneDaySale());
44                     statistics.setDay(storage.getStatisticsDay());
45                     //向统计表插入最后一日销量
46                     statisticsMapper.addStorageSaleStatistics(statistics);
47                     if(dateFormat.format(lastStatisticsDay).equals(dateFormat.format(yestoday))) {
48                         oneDaySale = storage.getOneDaySale();
49                     }
50                     //该商品当日当前未被购买过,销量为0
51                     storage.setOneDaySale(0);
52                     //更新统计日期
53                     storage.setStatisticsDay(today);
54                     //保存商品当日销量信息
55                     storageMapper.setStorageSnackOneDaySale(storage);
56                 }
57
58             }
59             storageModel.setDaySale(oneDaySale);
60             //设置之前七天销量
61             List<Integer> lastSevenDaySaleList = statisticsMapper.getStorageLastSeventDaySale(storage.getId());
62             int lastSevenDaySale = 0;
63             for(Integer thisOneDaySale : lastSevenDaySaleList) {
64                 if(thisOneDaySale != null) {
65                     lastSevenDaySale = lastSevenDaySale+thisOneDaySale;
66                 }
67             }
68             storageModel.setWeekSale(lastSevenDaySale);
69             storageModelList.add(storageModel);
70         }
71         resultMap.put("storeSnacks", storageModelList);
72         resultMap.put("stockStatus", stock.getStatus());
73         return resultMap;
74     }

这是一个获取库存商品的方法,当用户短时间内在客户端连续点击刷新按钮时,这个方法会被执行两次,从而导致第46行代码被重复执行两次。从而,数据库中有两条一样的记录。当获取该商品的昨日销量时,会出现want to select one but find two的报错。

自己目前写的这个系统内,几乎所有的bug都是这样的原因导致的。

这是一个高并发导致的问题。

逻辑是,每天第一次统计时,要把之前的销售量作为单日销售量保存到统计表。获取商品时对商品销售量进行统计。并发的情况下,会出现,第一次获取商品时发现商品的最后统计日期不是今天,所以会把之前的销量插入到统计表(同时将最后统计日期改成今天),但还未来得及将最后统计日期改成今天时,已经并发执行第二次获取商品的请求了,这是,发现最后统计日期不是今天,所以会把之前的销量再次插入到统计表。那么,在获取该商品的昨日销量时,就会出现select one but find two 。。

时间: 2024-11-03 10:37:49

重复插入数据导致select one but find two的问题的相关文章

SQl server 关于重复插入数据的测试

最近发布的脚本,有那种防止重复插入数据(包括存在时更新,不存在是插入的处理,判断的方向可能与下面的示例相反) 使用类似下面的 SQL declare @id int, @value int if not exists( select * from tb where id = @id ) insert tb values( @id, @value ); --else --  update tb set value = @value where id = @id; 或者是使用这种单句的 declar

避免重复插入数据sql server

insert into TN_JOBS(JAVA_ID,SERVER_IP,SERVER_PORT,JOB_CODE,JOB_NAME,JOB_START_TIME,JOB_MSG,JOB_STATUS,JOB_END_TIME)SELECT 'JOB001','','','','','','','',''where not exists(select * from TN_JOBS b where b.JAVA_ID='JOB001') 原文地址:https://www.cnblogs.com/

MySQL防止重复插入相同记录

我们在用insert往数据表中插入数据时,为了不重复插入数据,往往先在数据表中查询一下该条数据是否已经存在,若不存在才进行插入. 这样比较麻烦. 找到一个方法:使用 insert if not exists语句,就不需做上述两道工序,轻松防止插入重复数据. 语法: INSERT INTO TABLE (field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS ( SELECT fi

mysql 插入数据避免重复的手段

MySql避免重复插入记录 发布于: December 15, 2011, 6:02 pm 分类: MySQL 作者: Cyrec 阅读: [308] 今天用python抓取数据入库需要避免重复数据插入,在网上找了一些方法: 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into table_name(email,phone,user_id) values('[email protec

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

SQL多个主键的表,插入数据有重复时,会提示违反主键约束不能插入的错误.那么,如何找到插入数据的重复值? 解决方法:使用group by 假设有个表#a,有saleid,vendorid,comid,price,saleprice,quantity等字段. 主键是:saleid,vendorid,comid三个.假设插入#a的数据源可能会有重复的. 即:saleid,vendorid,comid三个字段都一样的字段,那么插入#a的时候会报主键冲突,违反主键约束. 如果想找出#a表中插入重复的值可

MySQL 语句级避免重复插入—— Insert Select Not Exist

想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法. INSERT INTO table(column1,column2,column3 ...columnN) SELECT value1,value2,value3 ...valueN FROM dual WHERE NOT EXISTS( SELECT * FROM table WHERE value = ? ); dual是为了构建查询语句而存在的表,Oracle中很常见,配合INSERT ... SELECT

抓取新浪微博数据存入MongoDB,避免重复插入微博数据的方法

def getMyDatalist(): #id这个key key = str(u'id').decode('utf-8') #存储旧数据的id列表 old_ids = [] #存储新微博的列表 extr_wb = [] #从MongoDB上获取的数据 old_datalist = weibodata.find() for old in old_datalist: old_ids.append(old[key]) #从微博上抓取新数据 data = client.statuses.home_ti

oracle 插入数据前判断表中是否存储重复数据

有时候用oracle的数据库,插入数据的时候需要判断一下该条数据是否已经存在. 我们的第一思路如下,首先执行下面这个sql: select count(*) isExists from t_test_lll: 然后判断isExists等于0与否,如果等于0,则执行insert. 上面这样写,也可以,但是多写很多代码,不利于后期维护. 其实oracle可以内置在insert语句中进行判断,如下sql: insert when (not exists (select 1 from t_test_ll

mysql插入数据时,去掉重复的数据;

1. 利用insert ignore into语句去重 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'J', 'T'); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'J', 'T'); Query OK, 0 r