トランザクション
データベースは、検索、登録、更新、削除などの一連の処理をトランザクションという単位にまとめてデータの管理をしている。
トランザクション制御
あるデータベースに対して、複数のユーザーからアクセスした際に生じうるデータの矛盾や、一連の処理の途中でデータベースが終了してしまうなどの異常が発生した場合に備えて、データの整合性を保つために用意されている機能のことをトランザクション制御という。
データベースとテーブルの概要
使用するデータベースの概要は以下の通りである。
データベースソフト | データベース名 |
---|---|
MySQL5.6 | blog |
使用するinventory表の概要は以下の通りである。
フィールド名 | データ型 | 説明 |
---|---|---|
id | 数値型 | 在庫ID |
item | テキスト型 | 商品名 |
inventory | 数値型 | 在庫数 |
A | 数値型 | ユーザーAの注文数 |
B | 数値型 | ユーザーBの注文数 |
まず、ユーザーAとユーザーBが順番に同じ商品の注文をした場合について考える。
注文前のinventory表の状態が下記である。
1. ユーザーAがオレンジを3個注文し、在庫から3個引く。
2. ユーザーBも3個オレンジを注文したいが、在庫が2個なので2個だけ注文し、 在庫から2個引く。
次に、ユーザーAとユーザーBが同時にリンゴを3個ずつ注文する場合について考える。
注文前のinventory表の状態が下記である。
今回はリンゴの在庫が5個のため、両方の注文を受けると矛盾が生じる。
この場合は、片方の処理を受けつけ、もう片方はエラーにならなければならない。
この処理を正しく行うために、トランザクションの機能を利用する。
1. ユーザーAがトランザクションを開始し(start tranasction)、リンゴを3個注文し、在庫から3個引く。
2. ユーザーBがトランザクションを開始し(start tranasction)、リンゴを3個注文し、在庫から3個引く。しかし、ユーザーAが先にリンゴの注文をしているため、ユーザーBは待機状態になる。
3. ユーザーAの処理が正常終了したので、トランザクションを確定する(commit)。
※今回は確定したが、トランザクションを取り消すこともできる(rollback)。
4. ユーザーAのトランザクションが確定したので、ユーザーBの待機状態が解除される。しかし、リンゴの在庫が2個なので、ユーザーBのリンゴの注文はエラーになり、取り消しとなる(rollback)。
このように、同時に注文した場合も、トランザクション機能を利用することでデータの整合性を保つことができた。
最後にトランザクション制御のまとめが下記となる。
トランザクション制御(正常終了)
- トランザクションを開始する(start transaction)
- 検索、登録、更新、削除などの一連の処理を行う
- 正常終了すればトランザクションを確定させる(commit)
トランザクション制御(異常終了)
- トランザクションを開始する(start transaction)
- 検索、登録、更新、削除などの一連の処理を行う
- 異常終了すればトランザクションを取り消し、トランザクション開始時点まで戻る(rollback)