10月19日(火)1、2コマ目 リンクを取得 Facebook × Pinterest メール 他のアプリ 11月 01, 2021 Javaでトランザクション 演習課題(在庫引当) ポイントになったItemDAOクラスのUpdate()メソッドとサーブレットだけあげておきます。 ItemDAOクラス サーブレット リンクを取得 Facebook × Pinterest メール 他のアプリ
10月7日(木)3、4コマ目 10月 07, 2021 今日、やったこと Javaでトランザクション実装 今日のホワイトボード JDBCのデフォルト設定 SQLを実行するたびに、コミット実行。 図 JDBCのデフォルトではSQL実行毎にコミットする そのため、複数のSQL実行後、コミットするまたはロールバックすることができない。 Javaでトランザクション実装 ①自動コミット機能をオフ setAutoCommit(false) で自動コミット機能を無効にする。 ②コミット実行 トランザクションのSQLがすべて実行したあとでコミット実行。 ③ロールバック実行 SQL実行時にエラーが発生すると、例外がスローされる。 よって、 try{ }ブロックでSQL実行 catch{ }ブロックでロールバック でSQL実行に失敗するとロールバックできる。 図 コミット、ロールバックの実装 ここまでの実装ではコネクションをクローズしていない 〇古典的な書き方 古典的な書き方ではfinally{ }ブロックでクローズする。 図 finally{}ブロックでDBクローズ 〇Java7以降(リリース:2011年) Java7で追加されたtry with resourcesを使うと明示的にクローズしなくてもいい。 図 try with resourcesで自動クローズ ロックする ロック対象行が取得できるSELECT文にFOR UPDATEをつけて 実行。 コミット、ロールバックするまでロックされる。 今日作ったソース いちおう挙げておきます。 続きを読む
10月5日(火)1、2コマ目 10月 07, 2021 今日、やったこと トランザクション 今日のホワイトボード よくあるトランザクションの説明(原子性) 1トランザクションは複数の更新系SQLで構成されるケースが多い。 トランザクション終了時には SQLがすべて成功 SQLはすべてキャンセル のいずれでなければならない。 これがトランザクションの 原子性 。 図 よくあるトランザクションの説明(トランザクションの原子性) コミット、ロールバック トランザクションの原子性を確保するために コミット 、 ロールバック がある。 コミットは全ての更新を確定する ロールバックは全ての更新をキャンセルする 図 コミット、ロールバック トランザクションの独立性 複数のトランザクションが同時に実行されても、互いに影響を及ぼさないようにトランザクション同士を分離して独立性を確保する。 ただ、トランザクション同士の分離レベルが、全く分離しない(Read Uncommitted)から、ほぼ完ぺきに分離(Serializable)まで4段階ある。 この分離レベルによっては他トランザクションにいろいろな影響(ダーティーリード、ファジーリード、ファントムリード)を及ぼすことがある。 〇ダーティーリード 他トランザクションが更新したがコミットしていないデータを参照してしまう状態。 図 ダーティーリード 多くのデータベースはトランザクション分離レベルがRead Committed。 Read Committedでは、非コミットデータは別トランザクションには見せないようになっている。 図 トランザクション分離レベル「Read Committed」 〇ファジーリード 他トランザクションが更新することで、同じ行のデータが検索ごとに値が異なる状態。 〇ファントムリード 他トランザクションが更新することで、検索ごとにデータ件数が異なる状態。 ロック DBは更新時に対象行をロックする。 ロックすれば、他接続からはロックできない。よって、更新ができない。 ロックはコミット、ロールバックで解除される。 図 ロック 手動でロック ロック対象行を取得するSELECT文にFOR UPDATEをつけて実行すると、ロックができる。 更新時の(DBが実行する)自動ロックではダメな場合に利用。 コミット、ロールバックでロックは解除される。 図 手動ロック 次回は Ja... 続きを読む
10月26日(火)1、2コマ目 10月 25, 2021 今日、やったこと C#のusingステートメント C#+オラクルでトランザクション実装 今日のホワイトボード C#のusingステートメント DBアクセスプログラムに便利なusingステートメントの紹介。 要はJavaのtry with resources。 古典的なプログラミング finally{}ブロック内でコネクション等をクローズする。 図 古典的なDBアクセスプログラム usingステートメントを使う using()内で宣言、生成したインスタンスはusing(){ }ブロックを抜ける際に、Dispose()が呼び出される。 Dispose()内ではclose()を実行しているため、結果的にDBをクローズすることができる。 図 usingステートメントを使ったDBアクセスプログラム ※プログラム先頭のusingは Javaのimportのように、名前空間(Javaのパッケージ)をインポートする際に利用するのは usingディレクティブ 。 C#+オラクルでトランザクション 基本的な流れはJavaと同じだが、Transactionオブジェクトに注意。 図 トランザクション処理を行うプログラム ソースコードを挙げておきます。 サンプルアプリケーション3 Webアプリケーション版のトランザクションサンプルを作成しました。 ポイントになるソースを挙げておきます。 ItemDAOクラス Index.cshtml Index.cshtml.cs 続きを読む