話題の記事

[速報] ACID トランザクションをサポート! MongoDB 4.0 がリリースされました! #MDBW18

アメリカ・ニューヨークで開催されている MongoDB のカンファレンス、MongoDB World'18にて、MongoDBの新しいメジャーバージョンである、4.0 の正式リリースが発表されました。本記事では、その目玉機能であるマルチドキュメントトランザクションの特徴について紹介します。
2018.06.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

MongoDB使いのみなさん、ニュースです。現地時間の2018年6月26、27日、アメリカ・ニューヨークでは MongoDB のカンファレンス、MongoDB World'18 が開催されています。

そんな中、現在開催されいてるキーノートで、MongoDBの新しいメジャーバージョンである、4.0 の正式リリースが発表されました。

MongoDB 4.0 の目玉は、以前よりアナウンスされていたマルチドキュメントトランザクションのサポートです。

MongoDB 4.0 では複数ドキュメントの ACID トランザクションがサポートされます

本記事では、マルチドキュメントトランザクションについてリリースノート、ドキュメントからわかる内容を紹介します。

マルチドキュメントトランザクション

まず注意すべきは、マルチドキュメントトランザクションがサポートされても、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オペレーションが可能。異なるデータベース間のオペレーションも可能。
  • configadminlocalデータベースに対しての読み書きは不可
  • 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 ストレージエンジン対応に匹敵する大きなアップデートだと思います。