ナマケモノの家

ナマケモノ

概要

SQLite の排他制御の動作が不思議だったので、検証コードを作ってテストした。

検証コード

require 'rubygems'
require 'sqlite3'

DBfile = "./test.db"

unless File.exist?( DBfile )
  db = SQLite3::Database.new(DBfile )
  sql = <<EOS
create table  data (
    id        integer  primary key,
    name      text
);
EOS
  db.execute_batch(sql)
  db.close()
end

0.upto( 100 ) do |n|
  db = SQLite3::Database.new(DBfile )
  ecount = 0
  begin
    db.busy_timeout(5000)
    db.transaction do
      STDERR.print(".")
      STDERR.flush()
      db.execute("insert into data ( name ) values ( ? )", n )
      rand(11).downto( 0 ) do |n|
        STDERR.print("-")
        STDERR.flush()
        sleep(1)
      end
    end
  rescue SQLite3::BusyException
    STDERR.print("*")
    STDERR.flush()
    if ecount > 10
      print ">SQLite3::BusyException\n"
      exit
    end
    ecount += 1
    sleep(1)
    retry
  rescue => e
    p $!
    exit
  end
  db.close()
  STDERR.print("\n")
  STDERR.flush()
  sleep( 1 )
end

実験

コンソールを 2つ開き、同じディレクトリで上記のプログラムを実行する。

判った事