データベースにおけるロック

 

 


 


データベースにおけるロック

 

データベースの世界では、並行処理はトランザクションの並行処理として扱われる。共有資源のアクセスの問題は、トランザクション処理の隔離性(Isolation)として捉えられ、きちんとしたメカニズムが用意されている。ここはデータベースのチュートリアルではないので、簡単にこれを紹介するに留める。

 

隔離レベル(Isolation Level)は、自分自身が持つ共有資源とのインタラクションについてするとともに、同じ共有資源をもつ他のスレッドとのインタラクションについてネゴシエーションするのに使われる。TRANSACTION_SERIALIZABLEはデータの信頼性のための最高のレベルである。

 

TRANSACTION_SERIALIZABLE: このレベルは最高のデータ保全性をもつ。serializableなトランザクションが終了するまでは他のトランザクション・スレッドはこのデータへの読み書きは出来ない。 Serializableというのは、直列な操作としてのプロセスをいい、オブジェクトの直列化と混同してはいけない。全体の処理能力は一番低くなるので、そのテンで問題がある場合は別のレベルに設定する。

 

TRANSACTION_REPEATABLE_READ: このレベルでは、他のトランザクションは読み出しはできるが変更は出来ない。最初のトランザクションが変更し、その変更した値を書き戻さない限り、読み出したデータは再度読み出しても同じであることが保証される。

 

TRANSACTION_READ_COMMITTED: このレベルでは、最初のトランザクションがコミット(commit)またはロールバック(rolls back)するまでは、他のトランザクションはそのデータの読み出しができない。これは一般的なJDBCのデフォルトの隔離レベルである。

 

TRANSACTION_READ_UNCOMMITTED: このレベルでは、最初のトランザクションが終了またはロールバックする前であっても他のスレッドがそのデータを読み出すことができる。

 

金額に絡むトランザクションはTRANSACTION_SERIALIZABLEのレベルを指定すべきだが、統計やマーケッティングなど細かな整合性を問わないアプリケーションではその他のレベルを採用して性能をあげる。

 

データベースは指定された隔離レベルに基づき、複数のトランザクションを受け付ける。従ってサーブレット開発者は、データベースアクセスのスレッド安全性に関しては、隔離レベルをきちんと把握するだけでよかろう。

 

 

前節     目次     次節