10月13日(火)1、2コマ目
きょう、やったこと
- Javaトランザクション(ロック)
- 演習課題
今日のホワイトボード
おさらい
Javaでトランザクション実装
基本は下図。
![]() |
| 図 トランザクション実装の基本パターン |
try with resourcesを使うと下図のようになる。
![]() |
| 図 try with resourcesでトランザクション実装 |
くどいけど、オラクルは
クローズ時に未コミットデータはコミットする
ので注意!!
ネットには結構、
クローズ時に未コミットデータはロールバックする
と書かれている。
ロック
ロックとは、データを排他制御するための仕組み。
データをロックした人(接続)しか、対象データにアクセスすることができなくなる。
ロック済みデータを他の人(接続)がロックすると、ロック解除待ちになる。
DBMSは更新系SQLを実行する際、対象行をロックする。よって、自分でロックする必要は基本的にない。
ただ場合によっては明示的にロックする必要がある。
ロックするには、ロック対象行を検索するSELECTにFOR UPDATEをつけて実行するだけ。
ロックを解除するには、コミットまたはロールバックを実行する。
![]() |
| 図 ロック |
演習課題について
一度に複数商品の在庫引当ができるところがややこしいポイント。
ボタンクリック時にdoPost()メソッドには、すべてのテキストボックス入力内容が送信されるため、どの商品に対する入力かを判断する必要がある。
ヒント
あくまでも一案です。このとおりに作る必要はありません。
〇数量入力用テキストボックスの名前は「quantity_商品ID」にする
これで名前からどの商品のテキストボックスかがわかる。
〇[doPost()にて]まず、送信データのすべての名前を取得
request.getParameterNames()で取得できる。
〇[doPost()にて]取得した名前がテキストボックスのものか判断
名前が「quantity_xxx」なら、数量入力用テキストボックス。
Stringクラスのmatches()メソッドで名前(String型)が「quantity_xxx」とマッチするかチェック。
取得した名前.matches("^quantitiy_.+$")
- quantity_で始まり(^quantity_)
- 任意の文字が1文字以上(.+)で終わる($)
〇[doPost()にて]名前がテキストボックスのものなら、入力値を取得
これは簡単。
request.getParameter(名前)
〇[doPost()にて]名前から商品IDを取り出す
名前「quantity_xxx」の_以降が商品ID。
Stringクラスのsplit()メソッドを使う。
取得した名前.split("_", 1)
split()メソッドの
- 第1引数は分割する区切り文字
- 第2引数は分割する回数
よって、取得した名前を_で1回分割。分割結果は配列。
分割結果のうち、ほしいのは2つの値。よって、分割結果配列のインデックス1が欲しい商品ID。
これで
どの商品(商品ID)に
何個(数量)引き当てをするかがわかる。
ここで商品別入力数量が取得できればそんなに難しくはないと思います。



コメント