- 浏览: 62655 次
- 性别:
- 来自: 北京
最新评论
-
wucaifang819787:
你好!麻烦问下不知道哪个图片行不行的:http://dl.it ...
struts2源码浅析(四) -
ChenXzh:
高手,佩服得五体投地
关于struts2报There is no Action mapped for namespace / and action name xxx_xxx
昨日上线的系统,今天查日志时发现有不少E11000 duplicate key errors的报错日志,当时十分费解,因为用的upsert,这个是原子操作,避免了线程并发带来的问题,但为什么会报重复主键的错误呢?
update( DBObject q , DBObject o , boolean upsert , boolean multi )
第一个参数是查询条件,第一个参数是要做的操作。
我的处理逻辑是这样的,集合中有3列联合唯一索引,此外还有6列属性值,4列要增加的列。
我的查询条件q是这么写的
QueryBuilder.start("mb").is(bsc.getMb()).and("sb").is(bsc.getSb()).and("fd").is(bsc.getFd()) .and("mft").is(bsc.getMft()).and("mst").is(bsc.getMst()).and("mtt").is(bsc.getMtt()) .and("sft").is(bsc.getSft()).and("sst").is(bsc.getSst()).and("stt").is(bsc.getStt()) .get()
mb,sb,fd是联合唯一索引。
要做的操作是
QueryBuilder.start("$inc").is(QueryBuilder.start("mc0").is(bsc.getMc0()).and("mc1").is(bsc.getMc1()) .and("sc0").is(bsc.getSc0()).and("sc1").is(bsc.getSc1()).get()) .get();
在测试时是一点问题都没有的
但为什么会有duplicate key errors呢?
upsert的原理是先根据q去查询,若没有结果,则先insert,若有结果则根据o进行update
所以唯一可能的问题是那6个属性列,因为它们不是唯一索引列,但仍然出现在查询条件中,这样就会出现索引列的值一样,但是属性列的值不一样,这样Mongodb进行insert,由于库中已经有了和当前值唯一索引相同的记录,故出现duplicate key errors。属性列的值是与索引列的值相关联的,但可能在计算的时候出错,导致属性列的值得到错误的结果。
同时,在Mongodb的官网jira中也有这个问题的讨论https://jira.mongodb.org/browse/SERVER-5928
// Insert test document > db.test.insert({_id:1, version:2, data:3}) // Get current document > var doc = db.test.findOne({_id:1}); > printjson(doc); { "_id" : 1, "version" : 2, "data" : 3 } // Perform some updates on doc.data ... // Update > db.test.update({_id:1, version:doc.version},{$set:{data:doc.data}, $inc:{version:1}}, true);db.getLastError(); // Update succeeded null // Try once more > db.test.update({_id:1, version:doc.version},{$set:{data:doc.data}, $inc:{version:1}}, true); // Failed with "non-unique key" since "version" field changed E11000 duplicate key error index: d2_feed0.feed.$_id_ dup key: { : 1 }
注意倒数第二行的
Failed with "non-unique key" since "version" field changed
和我得出的结论是一致的。
以后在使用upsert时,在查询条件中尽量只有唯一索引的列。
修改之后的代码
DBObject q = QueryBuilder.start("mb").is(bsc.getMb()).and("sb").is(bsc.getSb()).and("fd").is(bsc.getFd()).get(); DBObject o = QueryBuilder.start("$set") .is(QueryBuilder.start("mft").is(bsc.getMft()).and("mst").is(bsc.getMst()).and("mtt").is(bsc.getMtt()) .and("sft").is(bsc.getSft()).and("sst").is(bsc.getSst()).and("stt").is(bsc.getStt()) .get()) .and("$inc").is(QueryBuilder.start("mc0").is(bsc.getMc0()).and("mc1").is(bsc.getMc1()) .and("sc0").is(bsc.getSc0()).and("sc1").is(bsc.getSc1()).get()) .get();
使用set来解决可能出现的不一致问题。
发表评论
-
JAVA多线程-厕所问题
2012-11-22 11:55 1929在http://my.oschina.net/xpbug/bl ... -
第八章 最大自序列和
2012-11-01 20:29 833第八章的问题是常见的---最大自序列和 的问题 书中提 ... -
第二章 旋转字符串的思考
2012-10-26 16:09 845编程珠玑第二章旋转字符串,abcdefg向左旋转3位,变为de ... -
开源的Mongodb java client -- mango发布
2012-07-20 21:53 1852Mango ---- 一个非常简单的操作mongodb的 ... -
浅出Apache Cxf
2012-03-05 20:14 0由于业务需要,开放了系统的 Web Se ... -
struts2源码浅析(四)
2011-10-19 17:15 1512接上一篇讲了filter后,现在request到了action ... -
struts2源码浅析(三)
2011-10-19 16:50 1568接上篇http://mazhiyuan.iteye.com/b ... -
struts2源码浅析(二)
2011-10-19 16:34 2226接上一篇http://mazhiyuan.iteye.com/ ... -
struts2源码浅析(一)
2011-10-19 16:18 17271. Struts2架构图 请求首先通过Filter ... -
struts2.1权威指南-笔记
2010-12-19 22:36 10951.struts 1.x 和 struts 2.x的 ... -
Hibernate学习总结4---对象状态
2010-12-10 16:14 947session 的几个主要方法: 1,save方法和persi ... -
Hibernate学习总结3 --配置文件
2010-12-10 16:10 937如果不希望使用默认的hibernate.cfg.xml 文件作 ... -
Hibernate 学习总结一
2010-12-10 14:54 862引入: 模型不匹配(阻 ... -
HF servlet&jsp 前6章要点总结
2010-11-21 11:58 880今天有时间把前6章主要讲servlet的内容坐下总结。好了,开 ... -
jquery源码分析之属性篇
2010-11-20 20:09 1913jquery提供了一些快捷函 ... -
HF servelt&jsp 定制标记开发 要点总结
2010-11-13 11:41 13061.标记文件使用一个页 ... -
bean相关标准动作总结+复习
2010-11-07 23:22 7551.<jsp:useBean>动作会定义一个变量, ... -
HF servlet&jsp ---include 指令和动作元素
2010-11-07 23:02 8101.include的2种方式 include多用于网站中可重用 ... -
HF servlet&jsp 总结—无脚本的JSP
2010-11-04 18:26 7948无脚本的JSP 8.1在JSP页面使用动作元素 <js ... -
HF servlet&jsp 总结—使用JSP
2010-11-02 17:37 744初看HF系列的servlet&jsp前6章主讲的ser ...
相关推荐
[mysql]mysql通过on duplicate key update实现批量插入或更新(csdn)————程
mysql “ON DUPLICATE KEY UPDATE” 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列...
代码如下: insert into table(a, b, c) values (1, 2, 3) on duplicate key update c = c + 1;1 update table set c = c + 1 where a = 1; 另外值得一提的是,这个语句知识mysql中,而标准sql语句中是没有的。 ...
碰到了 #1062 – Duplicate entry ‘1′ for key ‘PRIMARY’ 当时那个急啊,原本的数据我已经全部删除了,没办法只有请求万能的百度了。我找了大半天终于给我给我找到了。兴奋ing,马上测试,O(∩_∩)O哈哈~成功了...
主要介绍了mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点,结合实例形式分析了replace into 与 insert into on duplicate key update的功能、基本用法与操作注意事项,需要的朋友可以...
mysql数据库Insert语句后加ONDUPLICATE KEY UPDATE,保证唯性如果在INSERT语句末尾指定了ON DUPLICATE KEY UP
clean the duplicate key
android studio创建9.patch图片,使用时出现Error: Duplicate resources 笔者运行环境:MacOs Catalina , android studio 3.6.3 原创文章 5获赞 2访问量 249 关注 私信 展开阅读全文 作者:徐州捕快
本篇文章是对mysql "ON DUPLICATE KEY UPDATE"语法进行了详细的分析介绍,需要的朋友参考下
本文介绍一下关于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法
今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on duplicate key update ...,我当时就想怎么不用Replace呢,于是回来就仔细查了下,它们果然还是有区别的
本文详细的介绍了关于INSERT INTO .. ON DUPLICATE KEY更新多行记录,有需要了解的同学可参考一下
E11000 duplicate key error collection: QQ.Blog index: _id_ dup key: { : “965464518_1301232446” } 后来知道错误的原因是:插入的数据和已有数据的 ID 重复了。 我想要的是:插入一篇日志,如果该日志(ID)...
在对看看的后台进行排序的时候,遇到了一个像这样的需求,在电影表中有ID(主键自增)和orderby(排序字段) ,假设有十条数据id分别从1-10之间,对应的...下面来看看Mysql的REPLACE和INSERT … ON DUPLICATE KEY UPDATE REP
深入理解和优雅使用ON DUPLICATE KEY Update 解决存在则更新,不存在则新增的问题 先看语法INSERT INTO table(id,a,……) values(1,‘xh’,……) ON DUPLICATE KEY Update a=‘value’,……; 举个例子 1,先创建表...
JDK8 Collectors.toMap IllegalStateException Duplicate key DEMO
在PostgreSQL / Sqlite中使用INSERT … ON CONFLICT DO UPDATE ,在SqlServer中使用MERGE和INSERT INTO … ON DUPLICATE KEY UPDATE在MySQL中INSERT INTO … ON DUPLICATE KEY UPDATE 。 还支持注入sql命令运行...