7月25日(火)3、4コマ目
今日、やったこと
C#でトランザクション実装
コミット、ロールバック
ロック
今日のホワイトボード
C#+ODP.NETでトランザクションの実装をしました。
トランザクションを実装するには
〇OracleTransactionオブジェクト取得
トランザクションは最後にコミット、ロールバックを実行する必要があります。
C#+ODP.NETではコミット、ロールバックはOracleTransactionオブジェクトが持つCommit()、Rollback()メソッドで実行します。
このOracleTransactionオブジェクトは接続済み(Open()実行済み)のOracleConnectionオブジェクトのBeginTransaction()で取得できます。
〇複数種類のSQLを同一トランザクションのメンバにする
また、1トランザクションで複数種類のSQLを実行する場合、複数のOracleCommandオブジェクトを使います。この複数のOracleCommandオブジェクトのTransactionプロパティに同じOracleTransactionオブジェクトをセットすることで、同一トランザクションのメンバになります。
|
| 図 OracleTransactionオブジェクト |
サンプルプログラム1 コミット、ロールバック
ソースコードをあげておきます。
Item.cs
商品情報受け渡し用クラス。いつもプロパティとコンストラクタのクラス。
ItemDAO.cs
ポイントはUpdate()のOracleTransactionを使ったトランザクションに関する実装。
using(){ }を使えば、自動的にClose()を実行してくれる。
|
| 図 using(){ }で自動的にClose()実行 |
Index.cshtml.cs
価格を入力するテキストボックスが増減する可能性があるため、OnPost()の引数で入力値を取得することができない。
そこで、Request.Formプロパティを使って、name属性、value属性の取得を行っている。
|
| 図 価格入力用テキストボックスのname属性から対象商品のIDがわかるように |
|
| 図 検索条件に正規表現を使ったあいまい検索 |
Index.cshtml
価格入力用テキストボックスのname属性から対象商品のIDがわかるような名前にしている。
トランザクションサンプル2 ロック
更新をする前に手動でロックするサンプル。
Item.cs
商品情報受け渡し用クラス。おなじみのプロパティとコンストラクタのクラス。
ItemDAO.cs
ポイントはUpdate()。
トランザクションを構成するSQLは
- ロック+在庫数取得のSQL
- 在庫数更新のSQL
の2つ。これらを実行するOracleCommandのTransactionプロパティに同じOracleTransactionオブジェクトをセットすることで、同一トランザクションのメンバになる。
コミットすれば、更新確定、ロックは解除。
ロールバックすれば、更新キャンセル、ロックは解除。
Index.cshtml.cs
またまた入力値を取得するためにRequest.Formプロパティを使っている。
Index.cshtml
次回は
夏休み明け。トランザクションの練習問題、確認テストです。



