2009年7月2日木曜日

sqlite3 トランザクション 備忘録

この記事を書いた時点では、sqlite は version 3.6.16 です。

トランザクション周りがどうなっているのか、細かい部分が気になる。

マルチプル・アクセスについてを見ると、Read Commited とか、Read Uncommited という問題ではなくて、単純に Reader Writer Lock パターンを利用しているみたい。ソース・コードを見ていないので、可能性を推測してみると(挙動のヒントページ

複数のトランザクションが同時に並行して実行され、ページ単位、または、レコード単位に書き込みオーナー(スレッド|プロセス)が記録されていて、同じ箇所を書き込みしようとした場合には、後だしジャンケンの方が CONFLICT を受け取り、ロールバックするのがデフォルトの動作。 ただし、データベース自体を書き込み中に排他ロックするパターンもあるようだ。

という線が濃厚。もし前者の場合、トランザクション中に書き込みされているレコードの読取が、どのような位置づけなのか非常に気になる。整合性の無いダーティ・リードのような気がしてしょうがない。この動作が嫌なら排他ロックせよって事なのだろうか・・・。

絶えず Read があり、頻繁に Write が発生する場合には、テーブルを別DBに分けてしまう方が、レスポンスは高くなりそうである。

うーん・・・使いどころが微妙な感じだ・・・。

0 件のコメント: