あるソフトウェアエンジニアの戯言

日々の開発やサーバ管理のなかで出てきたあれや、これや、あんなことや、こんなこと

キーワード「SQLite」の記事 < 前のページ次のページ >
この記事のキーワード:   Database   SQLite   perl

通常、sqlで複数のプロセスから同一のデータベースを操作する場合、auto commitモードを使用しないのであれば、transactionを使用することになるが、sqlite3でtransactionを使用する場合、同時にデータベースにロックがかかり、他のプロセスから書込がブロックされる(読み出しはできる)。

この場合の挙動は以下のようになる。

  1. begin work を実行した時点ではロックはかからない
  2. begin work を実行したあと、select, insert, update 等なんらかのコマンドを実行した時点でデータベースがロックされ、他のプロセスからの書込がブロックされる。
  3. commitまたはrollback を実行すると、ロックは解除され、他のプロセスに対するブロックも解除される。

perlのDBIを使用した場合も同様で、AutoCommitモードをundefで利用する場合は注意が必要。

  • AutoCommit=undefの場合、データベースにconnectした時点および、commit, rollbackを発行した時点で、次のbegin work が自動的に発行されるため、ひとつでもコマンドを発行すると、データベースがロックされてしまう

結論

  • sqlite3をfcgi等、長期間永続するconnectionで利用する場合は、AutoCommitモードを通常onにし、必要な部分のみbegin_work-commit/rollbackでtransactionを利用する。
  • もし、AutoCommitモードoffで利用する場合は、適宜 rollback を発行してデータベースのロック状態を解除するようにする。
キーワード「SQLite」の記事 < 前のページ次のページ >

キーワードリスト

バックナンバー