論理削除とrollbackの話

今日のまとめ

論理削除と物理削除

物理削除はDELETE文を使って物理的にデータを削除してしまうことです。データベースから完全にレコードを削除してしまって、簡単には復元することはできません。(バックアップデータから復元しなければいけない)
対して論理削除は、間違って消してしまっても簡単に復元できます。データベースにフラグとなるフィールドを用意しておいて、削除するときに削除フラグを立てることで、表示時にそのデータを見せなくする方法です。UPDATE文を使います。
こんなときに論理削除を使います。

  • ユーザーからはデータがないように見せたいけど、実際のデータは消したくないとき

  • "削除した"データを検索したい

  • 誤った操作をしたとき、すぐに元に戻したいとき

削除フラグ・・・「削除したものとして扱いますよ」というフラグ

rollback

トランザクションで行われた作業を元に戻すためのメソッドです。現在のトランザクションを終了して、保留中の変更をすべてデータベースにロールバックします。

7ちゃんの例 f:id:marikooota:20160426233521p:plain

7ちゃんがデータを更新して新しいデータに変更されるまで一連の流れをトランザクションといいます。
7ちゃんは"hachichan"というアカウント名に変更しようとしていますが、更新中にエラーが起きてしまいました。そのため、"hachichan"という更新途中のデータはトランザクションを開始したときの"nanachan"という更新前のデータに戻ってしまいます。

つまり、トランザクションを開始して、何らかの障害が更新途中の処理で起きてしまった場合、更新途中のデータでもトランザクション開始時の状態に戻してデータの整合性を保つ処理を行う必要があります。この処理のことをロールバックといいます。

ロールバック・・・データ更新などで障害が起こったときに、その前の状態にまで戻ることをいう。 後進復帰とも言う。


今日の復習!!

Spring Framework

Javaプラットフォーム向けのオープンソースアプリケーションフレームワーク・・・。

アプリケーションフレームワーク・・・アプリケーションを実装するために使われるクラスやライブラリの集まり

ReflectionUtils

例外処理するためのシンプルなユーティリティークラス。

Invoke

発動させるという意味。メソッドを発動(実行)させる。

@AutoWired

DIコンテナがその変数の型に代入できるクラスを@Componentの付いているクラスから探し出し、インジェクションしてくれる

DI・・・オブジェクト間で依存性のあるコードを実行時に注入するという設計思想
インジェクション・・・注入

pageContext

ページの情報を取ってくるオブジェクト

JSTL

JavaServer Pages Standard Tag Libraryの略。
JSPで利用される標準的なカスタムタグをまとめたもの。

参考サイト データベースの論理削除と物理削除
クロスイデアBlog「論理削除か物理削除か」
Oracle® Database SQL Reference
IT用語辞典 ロールバック
基本情報技術者講座

楽観ロックと悲観ロック

今日のまとめ

楽観ロック

あるデータをAさんが更新処理をしている間にBさんも処理が可能です。 でも、更新処理をAさんが先に完了してしまうと、Bさんの更新処理は失敗してしまいます。

7ちゃんとマロくんの例

f:id:marikooota:20160425231509p:plain

楽観ロックの場合、複数のユーザーが同時にデータを見ることができます。この例の場合、7ちゃんが更新中にマロくんはデータを見ることはできますが、7ちゃんが更新処理を先に完了してしまうと、マロくんは更新することはできずにエラーになってしまいます。また、更新したことは告げられないので、現在マロくんが見ているデータが最新のものであるかはわかりません。

悲観ロック

あるデータをAさんが処理していた場合、BさんはAさんの処理が終わるまで、そのデータに触ることはできません。悲観ロックはデータを読み込んだ時点から始まります。

7ちゃんとマロくんの例

f:id:marikooota:20160425233631p:plain

悲観ロックはユーザーが読み込みや更新処理を行っているときは、他のユーザーはそれらの処理を行えません。この例の場合、7ちゃんがデータ更新中に、マロくんはデータに触ることができません。7ちゃんの更新が終わってロックが解除されたタイミングで、マロくんはデータに触ることができます。悲観ロックであれば、今見ているデータは最新であると言うことが保証されますが、次に処理したい人は、前の人の処理が終わるまで待たなければいけません。

排他制御(ロック)

あるトランザクションが実行中のときに、そのトランザクションが対象としているデータを制御(ロック)し、他のトランザクションのアクセスを禁止することで、データの整合性を確保しようとする仕組みのこと。

トランザクション・・・一連の処理

整合性・・・ずれがなく揃うこと


今日の復習!!

三項演算子の書き方
条件式 ? 式1 : 式2

条件式の値がtrueだった場合、式1が処理され、falseだった場合、式2が処理されます。
if文の代わりに使える。

isEmptyメソッド

isEmptyは文字列がnull"空文字"かをチェックします。

StringUtils.isEmpty(null);     // true
StringUtils.isEmpty("");       // true
StringUtils.isEmpty(" ");     // false
StringUtils.isEmpty("meow");     // false
StringUtils.isEmpty("  meow  "); // false
isBlankメソッド(こんなメソッドもある!!)

isBlankは文字列が"空文字"かをチェックします

StringUtils.isBlank(null);     // true
StringUtils.isBlank("");       // true
StringUtils.isBlank(" ");     // true
StringUtils.isBlank("meow");     // false
StringUtils.isBlank("  meow  "); // false
isValidメソッド

戻り値boolean型
isValid();は、SQL例外がスローされた後でも接続が有効かどうかをチェックするために使用されます。 接続が有効な場合は true です。接続が有効でないか、タイムアウトするまでに接続の有効性を特定できない場合は、false です。

public boolean isValid(int timeout)
コンスタントプールの図(大石さんに教えてもらいました)

f:id:marikooota:20160426004343j:plain

参考サイト 条件演算子(三項演算子)
悲観もあれば楽観もある「トランザクション」の常識
TECHSCORE(排他制御)