[2010-02-25]
sqlite3 の transaction と データベースの lock
通常、sqlで複数のプロセスから同一のデータベースを操作する場合、auto commitモードを使用しないのであれば、transactionを使用することになるが、sqlite3でtransactionを使用する場合、同時にデータベースにロックがかかり、他のプロセスから書込がブロックされる(読み出しはできる)。
この場合の挙動は以下のようになる。
- begin work を実行した時点ではロックはかからない
- begin work を実行したあと、select, insert, update 等なんらかのコマンドを実行した時点でデータベースがロックされ、他のプロセスからの書込がブロックされる。
- 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 を発行してデータベースのロック状態を解除するようにする。
| Permalink | トラックバック ( 0 ) | コメント ( 0 / 0 ) | すぎた / 2010-02-25 16:06:28 |