import sqlite3 database=sqlite3.connect("test.sqlite3") database.execute("create table sample (id numeric)") database.commit() time.sleep(5.0) # ここで暗黙の begin transaction database.execute("insert into sample values (?)",(100,)) # insert time.sleep(5.0) # ここで暗黙の commit database.execute("vacuum") # vacuum time.sleep(5.0) print(database.execute("select count(*) from sample").fetchone()[0]) # select
import sqlite3 database=sqlite3.connect("test.sqlite3",isolation_level=None) # オートコミットを有効に指定 database.execute("create table sample (id numeric)") database.commit() time.sleep(5.0) # ここで暗黙の begin transaction database.execute("insert into sample values (?)",(100,)) # insert # ここで暗黙の commit time.sleep(5.0) database.execute("vacuum") # vacuum time.sleep(5.0) print(database.execute("select count(*) from sample").fetchone()[0]) # select
分離レベル | デフォルトに設定されているバージョン | 概要 |
---|---|---|
DEFERRED | 3.0.8〜 | トランザクションの開始ではなく、始めの SQL 文実行時にロックをかける |
IMMEDIATE | 3.0.0〜3.0.7 | トランザクション開始時にロックをかける |
EXCLUSIVE | 〜2.8 | トランザクション開始時に排他ロックをかける |
import sqlite3 # 変数 level に "EXCLUSIVE", "IMMEDIATE", "DEFERRED" のいずれかを設定しておく database=sqlite3.connect("test.sqlite3",isolation_level=level) # 分離レベルを level に設定 database.execute("create table sample (id numeric)") database.commit() time.sleep(5.0) database.execute("begin transaction") # begin transaction (A) time.sleep(5.0) database.execute("insert into sample values (?)",(100,)) # insert (B) time.sleep(5.0) database.commit() # commit (C) time.sleep(5.0) if level=="EXCLUSIVE": print(u"(A)〜(C) の間は他のプロセスは読み書き不可") elif level=="IMMEDIATE": print(u"(A)〜(C) の間は他のプロセスは書き込み不可") elif level=="DEFERRED": print(u"(B)〜(C) の間は他のプロセスは書き込み不可") print(u"(C) の実行開始〜終了の間は他のプロセスは読み書き不可")
戻る