p2pncs の分散ファイルシステム部をオンメモリDB (System.Collections.Generic.Dictionary)から SQLite に移行しようといろいろ調査中。
Mono.Data.SQLite を利用するとトランザクションの IsolationLevel には ReadCommitted と Serializable が利用可能でそれぞれ SQLite の Deferred と Immediate に相当する。
んで、Serializableなトランザクションは同時に複数実行することは出来なくて、ReadCommitted複数とSerializableは同時実行可能という感じ。
また、ReadCommittedを複数走らせ、その中で書き込み系のSQLを実行すると、
最初に書き込み系SQLが実行されたトランザクションがデータベースをロックしてしまい、
他のトランザクションの書き込み系SQLはブロックされる。
直感的には、最初に書き込み系SQLが実行されたトランザクションではCommitが成功すると思ってしまうが、
SQLiteではなぜかCommitもブロックしてしまい、
結果として全てのトランザクションがタイムアウトで失敗する。
とりあえずは書き込み時はSerializableを使って読み込み時はReadCommittedを使えば大丈夫かな?