DBD::SQLiteのトランザクション

perlで、DBIからDBD::SQLiteを使う場合のトランザクションの扱いについて。

トランザクションの開始

AutoCommit属性やbegin_workメソッドを使うと、その後のinsert,update等で

database is locked(5) at dbdimp.c 

が出てステートメントの実行に失敗してしまう場合がある。
これらを使わずにSQL文で"begin immediate"を実行した場合はこの問題は出ない。

トランザクションの終了

こちらも、DBIでのAutoCommit関連の挙動を回避するためにSQL文で"commit"する方が良いようだ。また、同じデータベースにアクセスしている他のプロセス/スレッドがSHAREDロックを守っている場合、commitは何もせずにエラーで戻ってくる。待機リトライループを書く必要がある。

The Definitive Guide to SQLite

The Definitive Guide to SQLite