データベース・トランザクション分離レベル

データベースのトランザクションの分離レベルにはいくつかありますが、データベースの教科書に乗っている理論は理想的なトランザクションを前提にしています。実際のところ世の中に出回っているデータベースの多くはその理想的なトランザクションを実装していなかったりパフォーマンスが低かったりしますのでアプリケーションの要件に応じて理想ではない分離レベルが選択されることがほとんどです。

理想的なトランザクションとはいわゆるSERIALIZABLE ( 直列化可能 )というもので、複数トランザクションが実行されている時にお互いに完全に独立な動作をします。

一般的に多く利用されているトランザクションはREAD COMMITTED ( 確定した最新データを常に読み取る )です。

データベースの経験が浅い技術者はこの差を意識せずにデータベースを設計しますが、実際のところ、どちらのトランザクション分離レベルを選ぶかによってデータベースのテーブル設計が異なる時があります。 よくある失敗としては、教科書通りにSERIALIZABLE ( 直列化可能 )の理屈でデータベース設計をして、実際のデータベースはREAD COMMITTED ( 確定した最新データを常に読み取る )で動いていた、あるいは、READ COMMITTED ( 確定した最新データを常に読み取る )しかサポートしていないデータベースを使っていた、という失敗が挙げられます。

実際のところ、プログラムの処理もどちらを選ぶかによって異なってきます。

SERIALIZABLE ( 直列化可能 )を選んだ場合、トランザクション間で同一データに対して更新を行うと失敗するように設定することが多く、その処理を実装する必要があります。READ COMMITTED ( 確定した最新データを常に読み取る )の場合は更新自体は一見成功したかのように見えることがありますのでアプリケーションの作りあるいはアプリケーションの仕様でそういう挙動である旨を明示しておかなければユーザに誤解を与えます。又、READ COMMITTED ( 確定した最新データを常に読み取る )の場合は設計によってはデータが一貫して取得できない可能性がありますので、必ず一貫したデータを表示すべき場合には考慮してデータベース設計をする必要があります。

このように、旧来のデータベースには考慮すべき点があるのですが、最近はNoSQLが流行っていることもあり、こういった違いが意識されることが少なくなったように思えます。それ故に、アプリケーションで不思議な動作が生じたりもするのですが、最近は、基本的なことがわかっていなくてなんとなくアプリケーションを作れてしまう場合もありますので、やはり基本を押さえた設計及び実装が大切だと思われる次第です。

2017/5/24

ログイン当サイトのユーザ名(ID)でログイン
クイックログイン:Facebookのアカウントで即時ログイン(ログイン情報保持オプション:ON) / 新規登録


お問い合わせ

© 2016-2018 Matsuesoft Corporation