- 浏览: 64724 次
- 性别:
- 来自: 北京
最新评论
-
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 2010在http://my.oschina.net/xpbug/bl ... -
第八章 最大自序列和
2012-11-01 20:29 927第八章的问题是常见的---最大自序列和 的问题 书中提 ... -
第二章 旋转字符串的思考
2012-10-26 16:09 902编程珠玑第二章旋转字符串,abcdefg向左旋转3位,变为de ... -
开源的Mongodb java client -- mango发布
2012-07-20 21:53 1889Mango ---- 一个非常简单的操作mongodb的 ... -
浅出Apache Cxf
2012-03-05 20:14 0由于业务需要,开放了系统的 Web Se ... -
struts2源码浅析(四)
2011-10-19 17:15 1613接上一篇讲了filter后,现在request到了action ... -
struts2源码浅析(三)
2011-10-19 16:50 1624接上篇http://mazhiyuan.iteye.com/b ... -
struts2源码浅析(二)
2011-10-19 16:34 2290接上一篇http://mazhiyuan.iteye.com/ ... -
struts2源码浅析(一)
2011-10-19 16:18 17921. Struts2架构图 请求首先通过Filter ... -
struts2.1权威指南-笔记
2010-12-19 22:36 11371.struts 1.x 和 struts 2.x的 ... -
Hibernate学习总结4---对象状态
2010-12-10 16:14 1003session 的几个主要方法: 1,save方法和persi ... -
Hibernate学习总结3 --配置文件
2010-12-10 16:10 1021如果不希望使用默认的hibernate.cfg.xml 文件作 ... -
Hibernate 学习总结一
2010-12-10 14:54 905引入: 模型不匹配(阻 ... -
HF servlet&jsp 前6章要点总结
2010-11-21 11:58 953今天有时间把前6章主要讲servlet的内容坐下总结。好了,开 ... -
jquery源码分析之属性篇
2010-11-20 20:09 1967jquery提供了一些快捷函 ... -
HF servelt&jsp 定制标记开发 要点总结
2010-11-13 11:41 13431.标记文件使用一个页 ... -
bean相关标准动作总结+复习
2010-11-07 23:22 8041.<jsp:useBean>动作会定义一个变量, ... -
HF servlet&jsp ---include 指令和动作元素
2010-11-07 23:02 8471.include的2种方式 include多用于网站中可重用 ... -
HF servlet&jsp 总结—无脚本的JSP
2010-11-04 18:26 8778无脚本的JSP 8.1在JSP页面使用动作元素 <js ... -
HF servlet&jsp 总结—使用JSP
2010-11-02 17:37 823初看HF系列的servlet&jsp前6章主讲的ser ...
相关推荐
ON DUPLICATE KEY UPDATE`语句是一种非常实用的机制,它允许你在插入新行的同时处理可能出现的唯一性约束冲突。这个语句主要用于处理唯一索引(包括主键)的情况,当尝试插入的数据与现有数据冲突时,会触发更新已...
mysql “ON DUPLICATE KEY UPDATE” 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列...
在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在执行INSERT语句时,如果插入的数据违反了唯一性约束(即存在相同的唯一索引),则自动执行UPDATE操作来更新已有记录。这个功能在处理...
ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在尝试插入新记录时,如果插入的数据违反了唯一性约束(如UNIQUE索引或PRIMARY KEY),则自动更新已经存在的匹配行,而不是抛出错误。这个特性是MySQL特有...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在插入新数据时,如果遇到重复的唯一键值,自动执行更新操作,而不是抛出错误。这个功能大大简化了数据处理的流程,特别是当你需要在一...
MySQL的`ON DUPLICATE KEY UPDATE`语法是一种特殊的数据插入机制,它允许你在尝试插入新记录时,如果遇到唯一约束冲突(比如主键或唯一索引的值已经存在),则自动更新已有记录。这个特性在处理数据导入、同步或批量...
在MySQL中,`REPLACE INTO` 和 `INSERT INTO ON DUPLICATE KEY UPDATE` 是两种处理数据插入时冲突的方法,主要用于处理当试图插入一条记录时,若已有相同唯一键值的记录存在,应该如何操作的情况。 1. **REPLACE ...
- 当指定`ON DUPLICATE KEY UPDATE`时,只有在出现唯一键冲突时才会执行`UPDATE`部分的语句,更新冲突记录的指定字段。 - 示例中,当再次尝试`INSERT`一个`a=3`的记录时,由于`b`字段在`ON DUPLICATE KEY UPDATE`...
碰到了 #1062 – Duplicate entry ‘1′ for key ‘PRIMARY’ 当时那个急啊,原本的数据我已经全部删除了,没办法只有请求万能的百度了。我找了大半天终于给我给我找到了。兴奋ing,马上测试,O(∩_∩)O哈哈~成功了...
当试图插入的记录与现有记录在唯一索引上产生冲突时,`ON DUPLICATE KEY UPDATE` 将触发对已有记录的更新,而不是抛出错误。 首先,我们来看 `ON DUPLICATE KEY UPDATE` 的基本语法。假设我们有一个表格 `TABLE`,...
clean the duplicate key
android studio创建9.patch图片,使用时出现Error: Duplicate resources 笔者运行环境:MacOs Catalina , android studio 3.6.3 原创文章 5获赞 2访问量 249 关注 私信 展开阅读全文 作者:徐州捕快
ON DUPLICATE KEY UPDATE`这两种语句。这两种SQL语句可以帮助我们高效地处理数据冲突,避免繁琐的循环操作,提高数据库操作的效率。 首先,我们来看`REPLACE`语句。`REPLACE`类似于`INSERT`,但它会在检测到主键或...
E11000 duplicate key error collection: QQ.Blog index: _id_ dup key: { : “965464518_1301232446” } 后来知道错误的原因是:插入的数据和已有数据的 ID 重复了。 我想要的是:插入一篇日志,如果该日志(ID)...
INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3) ON DUPLICATE KEY UPDATE col1 = new_val1, col2 = new_val2, col3 = new_val3; 这个语句首先尝试插入数据,如果遇到唯一键冲突,就会执行...
这类错误通常出现在多张原理图的环境下,尤其是在涉及到网络标识符作用域的配置不当的情况下更为显著。本文旨在探讨这一问题的根本原因及其解决方案。 #### 二、错误产生的背景及原因分析 在Altium Designer中,...