[速報] ACID トランザクションをサポート! MongoDB 4.0 がリリースされました! #MDBW18
こんにちは、菊池です。
MongoDB使いのみなさん、ニュースです。現地時間の2018年6月26、27日、アメリカ・ニューヨークでは MongoDB のカンファレンス、MongoDB World'18 が開催されています。
そんな中、現在開催されいてるキーノートで、MongoDBの新しいメジャーバージョンである、4.0 の正式リリースが発表されました。
MongoDB 4.0 の目玉は、以前よりアナウンスされていたマルチドキュメントトランザクションのサポートです。
本記事では、マルチドキュメントトランザクションについてリリースノート、ドキュメントからわかる内容を紹介します。
マルチドキュメントトランザクション
まず注意すべきは、マルチドキュメントトランザクションがサポートされても、RDBのような正規化されたデータモデルを採用することは推奨されていないということです。多くのユースケースでは、これまでMongoDBで利用してきたような非正規化されたデータモデルが有効あるとされています。一貫した更新操作が必要なケースに絞って利用することが推奨されています。
前提条件
マルチドキュメントトランザクションを有効にするためには、環境として以下の条件が必要です。
- レプリカセット構成
- Feature Compatibility Version(FCV)4.0以降
- WiredTigerストレージエンジン
レプリカセット構成
マルチドキュメントトランザクションは、レプリカセット構成でのみサポートされます。シャードクラスタ構成では、次期バージョンである 4.2 でのサポートが予定されています。
Feature Compatibility Version(FCV)4.0以降
レプリカメンバー全てで、FCVが4.0以降である必要があります。FCVは以下のように確認可能です。
s0:PRIMARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) { "featureCompatibilityVersion" : { "version" : "4.0" }, "ok" : 1, "operationTime" : Timestamp(1530108917, 1), "$clusterTime" : { "clusterTime" : Timestamp(1530108917, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
WiredTigerストレージエンジン
WiredTigerストレージエンジンでのみ、マルチドキュメントトランザクションはサポートされます。MongoDB Enterpriseでのみ利用可能な、In-Memoryストレージエンジンや、廃止予定のMMAPv1では利用できません。
トランザクションオペレーション
トランザクションセッションでは、以下のような動作仕様となります。
- 既存のコレクションに対してCRUDオペレーションが可能。異なるデータベース間のオペレーションも可能。
config
、admin
、local
データベースに対しての読み書きは不可system.*
コレクションへの書き込みは不可- 実行計画(
explain
)は利用できない - トランザクションセッション外で作成されたカーソルに対して、セッション内での
getMore
オペレーションは不可 - トランザクションセッション内で作成されたカーソルに対して、セッション外からの
getMore
オペレーションは不可
トランザクション中に実行可能なメソッド
- db.collection.aggregate()
- db.collection.distinct()
- db.collection.find()
- db.collection.deleteMany()
- db.collection.deleteOne()
- db.collection.remove()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.insertMany()
- db.collection.insertOne()
- db.collection.insert()
- db.collection.save()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.replaceOne()
- db.collection.update()
- db.collection.bulkWrite()
ドライバ
各言語のMongoDBドライバでマルチドキュメントトランザクションを利用するためには、MongoDB 4.0以降をサポートしたドライバが必要です。最新のバージョンにアップデートしましょう。
アトミックな更新
マルチドキュメントトランザクションはアトミックです。
トランザクションがコミットされることで、セッション内で行われた全ての更新が保存され、トランザクション外から参照可能になります。トランザクションが中止された場合には、全ての変更操作は破棄されます。
ロックの取得
デフォルトでは、ロックを取得するまでに5ミリ秒待機します。5ミリ秒以内にロックが取得できない場合には、トランザクションは以上終了します。maxTransactionLockRequestTimeoutMillis
パラメータを使うことで、ロック待ち時間を調整することができます。
最後に
新たにリリースされた MongoDB 4.0 で待望のマルチドキュメントトランザクションがサポートされました。
RDBの代用になるという訳では決してありませんが、これまで、一部の処理に一貫性のある更新が必要であるために、RDBを併用していたケースや、アプリケーション側で複雑なエラー/リトライ処理を実装していた場合にはかなり助かるのではないでしょうか。
MongoDB 3.0 リリース時の WiredTiger ストレージエンジン対応に匹敵する大きなアップデートだと思います。