はじめに
こんにちは!エアークローゼットのMDです。この記事は、エアークローゼットアドベントカレンダー2024の23日目の記事です。
開発者として、日々リレーショナルデータベースを使って仕事をしています。今回は、トランザクションについて少し深掘りして紹介したいと思います。
トランザクションレベル
トランザクションレベルは、データベースにおけるトランザクションの分離レベルを指します。主なトランザクション分離レベルには以下の4つがあります:
- Read Uncommitted: 他のトランザクションがコミットしていない変更も読み取ることができます。データの一貫性が低い。
- Read Committed: 他のトランザクションがコミットした変更のみ読み取ることができます。ダーティリードを防ぎます。
- Repeatable Read: トランザクションが開始された時点のデータを読み続けます。何回読み込みを行っても同じ結果を返却します(他のトランザクションの同じデータ修正を防がない)
- Serializable: 完全に同時実行を防ぎ、他のトランザクションが同じデータにアクセスするのを防ぎます。最も高い一貫性を提供しますが、パフォーマンスに影響を与える可能性があります。
OptimisticロックとPessimisticロック
トランザクションロック仕組みも以下2つの種類があります
Optimisticロック(楽観的ロック)
Optimisticロックは、データの競合が少ないと仮定して動作します。トランザクションがデータを読み込み、更新時にそのデータが他のトランザクションによって変更されていないことを確認します。変更されていれば、トランザクションはロールバックされ、再試行されます。
メリット: スケーラビリティが高く、パフォーマンスが良い。
デメリット: データの競合が発生した場合、再試行が必要となり、パフォーマンスが低下する可能性があります。
Pessimisticロック(悲観的ロック)
Pessimisticロックは、データの競合が頻繁に発生すると仮定して動作します。トランザクションが開始されると、対象のデータをロックします。他のトランザクションはそのデータにアクセスできなくなります。トランザクションが完了すると、ロックが解除されます。
メリット: データの一貫性が保証されます1。
デメリット: スケーラビリティが低く、パフォーマンスが低下する可能性があります。デッドロックが発生する可能性もあります。
ではどちらを選ぶべきか
Pessimisticロック: データの競合が多い場合や、データの一貫性が非常に重要な場合に適しています(例:銀行口座の振込)。(InnoDBエンジン系のデータベースのデフォルトオプションです)
Optimisticロック: データの競合が少ない場合や、競合が発生しても再試行のコストが低い場合に適しています(例:オンラインショッピングカート・読み取りが多い)。
どちらのロック方式を選ぶかは、アプリケーションの要件やトランザクションの特性に応じて決定する必要があります。
まとめ
以上、DBのトランザクションについて紹介しました。
トランザクションに挟んで実行するではなく、ユースケースに適した機能を使って開発しましょう。
P.S.
最後まで読んでいただき、ありがとうございます!
エアークローゼットアドベントカレンダー2024はまだまだ続きますので、ぜひ他のエンジニア、デザイナー、PMの記事もご覧いただければと思います
また、エアークローゼットはエンジニア採用活動も行っておりますので、興味のある方はぜひご覧ください!