前回の排他制御の考え方と、今回のトランザクションを組み合わせて、2つのお客がほぼ同時に同じ商品を購入する場合を考えます(表3)。
| お客A | お客B | |
|---|---|---|
| トランザクション開始 | ||
| 在庫データをロックする | トランザクション開始 | |
| 在庫データをチェックする | 待機 | |
| 在庫を減らす | 待機 | |
| 注文データを登録する | 待機 | |
| コミット(ここでアンロック) | 待機 | |
| トランザクション終了 | 待機 | |
| - | 在庫データをロックする | |
| - | 在庫データをチェックする | |
| - | 在庫を減らす | |
| - | 注文データを登録する | |
| - | コミット(ここでアンロック) | |
| - | トランザクション終了 | |
| 表3 同時購入の例 | ||
表3に示す通り、お客Aがロックをかけている間、お客Bは待機します。お客Aのトランザクションが完了してアンロックすると、お客Bは待機状態から処理を再開します。これにより、2人が同時に在庫データを書き換えることを防ぎ、データの整合性を保ちます。
このように、トランザクションと排他制御を組み合わせることで、複数のユーザーが同時にアクセスしても、データを安全に管理できます。なお、購入処理の実装方法はいろいろありますので、あくまでも例題の一つだと考えてください。
今回は、排他制御の振り返りとトランザクションについて説明しました。トランザクションを使うことで、一連の処理をひとまとめにして、問題が発生した場合はロールバックによって変更内容を取り消すことができます。
世の中には、複数人で使用する製品がたくさんあります。完全に理解できなくても、イメージだけでも伝わればうれしく思います。
本連載で取り上げた「ソフトウェア技術者のためのバグ百科事典」を大幅に加筆、修正した山浦恒央先生の書籍「ソフトウェア技術者のためのバグ検出テキスト」が日科技連出版から好評発売中です。連載でも取り上げた、「要求仕様書のバグ」「実装抜けのバグ」「テスト業務のバグ」など、バグを36種類に分類して解説しています。囲碁や将棋であれば、「相掛かり」「矢倉」「四間飛車」「藤井システム」のような戦法を網羅した内容になっています。
前著「ソフトウェア技術者のためのバグ検出ドリル」(2019年11月刊行)も好評発売中です。実際にバグを含む要求仕様書、設計書、コーディング、デバッグ、保守を具体的に取り上げ、練習問題として31問を出題しました。同書は、囲碁や将棋における「次の一手」的な問題であり、ピンポイントの場面を取り上げ、実践力を鍛えることを目的としています。
両書とも興味のある方は、Amazon.comや書店でチェックしてください!
人間環境大学 環境情報学科 教授(工学博士)
イチから全部作ってみよう(33)「排他制御」をトイレのアナロジーで理解する
イチから全部作ってみよう(32)PythonでSQLを実行してデータベースを操作する
イチから全部作ってみよう(31)SQLを操作して実際にデータベースを作ってみる
イチから全部作ってみよう(30)データベース操作の共通言語「SQL」を使ってみる
イチから全部作ってみよう(29)3つのノート整理法からたどるRDBMSの基礎知識Copyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク