« 配列の評価ツール改良その2 | Main | Windowsプログラム »

Tuesday, July 26, 2005

ロック続き

なるちゃんの日記より

あー、確かに。何気なく「ロック」という単語使っちゃいましたが意味が広すぎますか。一応SERIALIZABLEとかの意味は分かったつもりになってますが、その上で「SERIALIZABLE」→「とっても安全にBEGINからENDまで長い時間全体をロックするみたいなもん」、「READ COMMITTED→とりあえずダーティーリード出ないだけの間ロックするみたいなもん」という、凄まじく曖昧な説明(?)です。…あれ、この認識自体が間違ってます?

ロックが何を指し示すかで変わりますが,ファイルロックのようなものを考えているなら,DBの実装によってはあってないと言えるかと...
ロックという言葉が,DBの中で使われる用途と同じと考えるなら,例えば InnoDB ならあってないです.

簡単に言うと,マルチバージョニングを使ったDBでは,ロックなしに READ COMMITTED のトランザクションが実行できます.
DBの中に,更新履歴がすべてor一部残っていて,トランザクションのタイミングによって読み込むデータを切り替えることで,うまく隔離しています.

例えば,テーブルの全行を読み込んでいる間に,別のトランザクションがレコードを書き換えたとします.
その場合,読み込みトランザクションは,その後のトランザクションで書き換える前のバージョンのレコードを読み取ります.
こういうロジックなので,そもそもロックして相手の実行を妨げたりしないのです.

PostgreSQLは履歴全部を持っていて,VACUUMというメンテコマンド実行時に不要なデータを消します.
InnoDB/Oracleは,最新データと,それ以前のデータへ戻すためのデータを持っていて,必要に応じて古いデータを参照します.こっちの場合は不要なデータは自動的に消えます.

というわけで,ロックではちと説明しきれない範囲かと...


あと,ロックで問題が発生する部分で,表を使って説明するとわかりやすいかも.
ちょっとがたがただけど,以下のイメージ.


プロセスA             ファイル        プロセスB
ファイルを読み取りで開く     100
100を読み込む         
ファイルを新規で開く         空
                                ファイルを読み取りで開く
                                空を読み込む
101を書き込む           101
ファイルを閉じる
                                ファイルを新規で開く
                      1         1を書き込む
                                ファイルを閉じる


|

« 配列の評価ツール改良その2 | Main | Windowsプログラム »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference ロック続き:

« 配列の評価ツール改良その2 | Main | Windowsプログラム »