次はセッション(という用語でいいのかは判らないけど)sqliteでセッションという概念が通じるか試してみる2012/07/14Androidのsqliteでinsert後にクローズしてからselectしてる、って話を聞いたので、表題のような疑問がわいた。今回試したのはAndroidのものでなくFreeBSD版なので、同じことをAndroidでも試す必要は当然ある。search?q=sqlite%E3%81%AB%E3%82%82%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%81%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A6%82%E5%BF%B5%E3%81%AF%E3%81%82%E3%82%8B&amp;btnI=luckyとりあえず用語が正しいかわからんけど、sqliteで一つのデータベースファイルに複数からの接続があった場合、この接続をセッションと呼んでみる。コマンドラインが使えそうか見てみるそういえば家のFreeBSDに導入していたなーという事でコマンドが使えるか試してみる。.quit$おお、動くっぽい。データベースファイルを指定なのかな。/home/tj510/work200/testdb.dbsqlite>正解ぽい。ついでなんで、テスト用にテーブルを定義した。お次はトランザクションの確認グーグル先生によればトランザクションサポートってことなんだけど、一応確認してみる。sample;abc|100def|200sqlite>明示的にトランザクションを指定できるのもわかった。次はセッション(という用語でいいのかは判らないけど)2つのセッションを開いてみる。いう使い方はNGなんだろうと思うけど。sqliteは1ファイル1データベースなんで、下手するとデータベースファイルを壊しちゃう可能性がある。最初の端末をtermA、新たに起動した端末をtermBとする。sample;abc|100def|200sqlite>別セッションでデータベースファイルを指定できて、テーブルの内容も読み出せてる。ここで、termAでの更新を行う。トランザクションは明示しない。sample;abc|100def|200jkl|400sqlite>この直後にtermBでSELECTしてみる。sample;abc|100def|200jkl|400sqlite>おお、読み出せている。次はtermA側の操作をトランザクション付きで実行。sample;abc|100def|200jkl|400mno|500sqlite>commitしないでtermBの操作をしてみよう。sample;abc|100def|200jkl|400sqlite>うむ。トランザクションは正しく効いている様に見える。termAでcommitしてからもう一度。sample;abc|100def|200jkl|400mno|500sqlite>ばっちり、セッション間でもトランザクションは独立して機能してる。INSERTとSELECTを同一セッションにしていないと、「INSERTしたのにSELECTできない」様に見えてしまうのかな、と思う。