ホームページ データベース mysql チュートリアル Mongdb的upsert出现E11000 duplicate key errors的错误分析

Mongdb的upsert出现E11000 duplicate key errors的错误分析

Jun 07, 2016 pm 02:53 PM
現れる

Mongdb的upsert出现E11000 duplicate key errors的错误分析 昨日上线的系统,今天查日志时发现有不少E11000 duplicate key errors的报错日志,当时 十分费解,因为用的upsert,这个是原子操作,避免了线程并发带来的问题,但为什么会报 重复主键的错误呢? w


Mongdb的upsert出现E11000 duplicate key errors的错误分析

 

昨日上线的系统,今天查日志时发现有不少E11000 duplicate key errors的报错日志,当时
十分费解,因为用的upsert,这个是原子操作,避免了线程并发带来的问题,但为什么会报
重复主键的错误呢?

www.2cto.com  

Java代码  

update( DBObject q , DBObject o , boolean upsert , boolean multi )  

第一个参数是查询条件,第一个参数是要做的操作。

 

我的处理逻辑是这样的,集合中有3列联合唯一索引,此外还有6列属性值,4列要增加的列。

 

我的查询条件q是这么写的

Java代码  

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是联合唯一索引。

要做的操作是

Java代码  

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。属性列的值是与索引列的值
相关联的,但可能在计算的时候出错,导致属性列的值得到错误的结果。

   www.2cto.com  

同时,在Mongodb的官网jira中也有这个问题的讨论https://jira.mongodb.org/browse/SERVER-5928

Java代码  

// 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 }  

 注意倒数第二行的

Java代码  

Failed with "non-unique key" since "version" field changed  

 和我得出的结论是一致的。

 以后在使用upsert时,在查询条件中尽量只有唯一索引的列。

修改之后的代码

  www.2cto.com  

Java代码  

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来解决可能出现的不一致问题。

 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DockerでのMySQLメモリの使用を減らします DockerでのMySQLメモリの使用を減らします Mar 04, 2025 pm 03:52 PM

この記事では、DockerのMySQLメモリ使用量を最適化することを調査します。 監視手法(Docker統計、パフォーマンススキーマ、外部ツール)および構成戦略について説明します。 これらには、Dockerメモリの制限、スワッピング、およびcgroupsが含まれます

mysqlの問題を解決する方法共有ライブラリを開くことができません mysqlの問題を解決する方法共有ライブラリを開くことができません Mar 04, 2025 pm 04:01 PM

この記事では、MySQLの「共有ライブラリを開くことができない」エラーについて説明します。 この問題は、必要な共有ライブラリ(.so/.dllファイル)を見つけることができないMySQLの障害に起因しています。ソリューションには、システムのパッケージMを介してライブラリのインストールを確認することが含まれます。

Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Mar 19, 2025 pm 03:51 PM

この記事では、MySQLのAlter Tableステートメントを使用して、列の追加/ドロップ、テーブル/列の名前の変更、列データ型の変更など、テーブルを変更することについて説明します。

Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Mar 04, 2025 pm 03:54 PM

この記事では、PHPMyAdminの有無にかかわらず、LinuxにMySQLを直接インストールするのとPodmanコンテナを使用します。 それは、各方法のインストール手順を詳述し、孤立、携帯性、再現性におけるポッドマンの利点を強調しますが、

sqliteとは何ですか?包括的な概要 sqliteとは何ですか?包括的な概要 Mar 04, 2025 pm 03:55 PM

この記事では、自己完結型のサーバーレスリレーショナルデータベースであるSQLiteの包括的な概要を説明します。 SQLiteの利点(シンプルさ、移植性、使いやすさ)と短所(同時性の制限、スケーラビリティの課題)を詳しく説明しています。 c

MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? Mar 18, 2025 pm 12:01 PM

記事では、証明書の生成と検証を含むMySQL用のSSL/TLS暗号化の構成について説明します。主な問題は、セルフ署名証明書のセキュリティへの影響を使用することです。[文字カウント:159]

MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド Mar 04, 2025 pm 03:49 PM

このガイドは、HomeBrewを使用してMacOSに複数のMySQLバージョンをインストールおよび管理することを示しています。 Homebrewを使用して設置を分離し、紛争を防ぐことを強調しています。 この記事では、インストール、開始/停止サービス、および最高のPRAを詳述しています

人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? 人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? Mar 21, 2025 pm 06:28 PM

記事では、MySQLワークベンチやPHPMyAdminなどの人気のあるMySQL GUIツールについて説明し、初心者と上級ユーザーの機能と適合性を比較します。[159文字]

See all articles