ちょっと話題の記事

DynamoDBのトランザクションについてFAQ形式で答えてみる #reinvent

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

公式ブログにてDynamoDBのトランザクションがネイティブサポートされました!概要は岡さんの記事でご確認ください。

[速報]待望のDynamoDBのトランザクションがリリースされました! #reinvent

こちらでは、トランザクションということは、、、、どこまでできるんだろう?という疑問にお答えできるようにFAQ形式で回答してみたいと思います。

FAQ形式でありがちな質問に答えてみる

Q.東京リージョンでも使えるの?

A.はい、全リージョンで今すぐ使えます。

Q.追加コスト掛かりますか?

A.いいえ、トランザクション機能自体に追加コストは掛かりません。なお、トランザクション指定した操作は、事前読み取りとコミット操作などの処理が入りますので、通常のREADとWRITE課金となります。そのため、キャパシティ設定にはAuto Scalingとかサイズの予約などをして置くと良いかと思います。

Q.IAMに追加ポリシーとか特別な設定は必要?

A.いいえ、既存の操作権限の延長ですので、追加のポリシーは必要ありません。つまり、UpdateItem, PutItem, DeleteItem, GetItemなどの権限があればそのまま利用できます。(TransactGetItemsとTransactWriteItems)

Q.常にトランザクション操作したほうがよい?

A.いいえ、トータルコストや性能面を考えて、トランザクション操作は局所化するべきです。また、構造的にコンフリクトを最小化する設計にしたほうが良いです。

Q.今までも読み取り一貫性はあったよね?

A.はい、今までも"1つのテーブル"に対して読み取り一貫性(Strongly Consistent Reads)のオプション指定(デフォルトは結果整合性:Eventually Consistent Reads)をすることができました。つまり、1つのテーブルに対する原子性のある読み取りはできていました。今回の大きなアップデートは、"複数のテーブル"に対して読み取りと書き込みの一貫性の指定ができるようになったということです。

Q.複数リージョン対応のグローバルテーブルの動きはどうなるの?

A.今回のトランザクション機能は、単一リージョンのテーブルに対して有効です。グローバルテーブルに対してもトランザクション指定自体はできます(要サポート申請)が、実際の動作としては、リージョン間で非同期レプリケーションしますので、一貫性の保証はありません。つまり、グローバルテーブルにおいて異なるリージョンから同時書き込みした場合はシリアライズな分離性の保証はありません。

Q.複数のAWSアカウントから使える?

A.いいえ、単一のAWSアカウント内でトランザクションを利用することができます。

Q.テーブルロックされる?

A.いいえ、テーブルのロックはされません。というか、DynamoDBのトランザクション分離レベルはSERIALIZABLEです。もし、トランザクション実行中に他からの操作が入った場合、トランザクションは中止されて詳細な情報とともに例外がスローされます。つまり、トランザクション操作するプログラム側は局所的なほうが良いかと思います。

Q.同時に何件の操作をまとめられる?

A.同時に10件のテーブル操作を1つのトランザクションにまとめることができます。

Q.TransactWriteItemsとBatchWriteItemの違いは?

A.どちらもまとめて操作するAPIですが、TransactWriteItemsは操作の途中で失敗したらロールバックしますが、BatchWriteItemの場合は途中まで書き込まれて中断します。単なるバッチ処理であれば、BatchWriteItemを使ったほうが良いです。

Q.トランザクション内で同じアイテムに複数操作できますか?

A.できません。

Q.DynamoDBのAPI毎の分離レベルってどうなっていましたっけ?

A.以下のテーブルを御覧ください。

操作 分離レベル 備考
DeleteItem Serializable
PutItem Serializable
UpdateItem Serializable
GetItem Serializable
BatchGetItem Read-committed バッチ内の1ユニット操作自体はSerializable
BatchWriteItem NOT Serializable バッチ内の1ユニット操作自体はSerializable
Query Read-committed
Scan Read-committed
TransactWriteItems (NEW!) Serializable
TransactGetItems (NEW!) Serializable

Q.AWSLabsで提供されているトランザクションライブラリあるよね?

A.今回のアップデートにより、サーバーサイドでネイティブ対応することができました。ぜひこちらを利用してください。

Q.GSI、Stream、バックアップとかとの関係は?

A.これらの操作は非同期処理です。トランザクションが成功した後に順次反映されます。失敗すれば反映されません。なかったことになります。

Q.DAX、Local、Mapperとかとの関係は?

A.今のところトランザクション機能には対応していません。

Q.冪等性って持てる?

A.はい、クライアントトークンを使って冪等性を実現できます。前回の操作から10分以内に同じクライアントトークンを使ったトランザクション操作をした場合、何も反映されずに処理は成功として扱われます。公式SDKを使っていれば特に気にせずに裏側で冪等性を持つ操作をしてくれそうです。

Q.トランザクションの監視はできますか?

A.CloudWatchのメトリクスで監視できます。

まとめ

今まで、DynamoDBとRDBMSの違いを説明するときは、トランザクション対応しているかどうかと発言していましたが、だんだん優劣の説明が難しくなってきましたw。特に最近の立て続けのアップデートはかなり強力でした。ネイティブでの暗号化、ポイントインタイムリカバリ対応、トリガー、グローバルテーブル、KMS対応、ローカルテスト、アクセラレータ、そして、今回のトランザクション対応によって、多くのデータベースの移行先や、新規サービスのデータベース基盤として、DynamoDBを検討できるのではないでしょうか。とくに、サーバーレスとかIoTのバックエンドとしてDynamoDBは無くてはならない存在です。今後の更なる進化にも期待したいですね。

参考

AWS News Blog

Amazon DynamoDB: 仕組み » 読み込み整合性

Amazon DynamoDB Transactions: How it Works