Hatena::ブログ(Diary)

yattの日記 このページをアンテナに追加 RSSフィード

2012-03-04

pythonのsqlite3モジュールでトランザクションする方法メモ

pythonのsqlite3モジュールトランザクションする方法をメモしておきます。なんか、ネットで調べてもなかなか日本語のサンプルが出てこなかったので。

sqlite3.connect()のisolation_levelオプション引数に分離レベルに対応する値を渡すだけです。

こんな形になります。以下サンプル。

import sqlite3
conn = None
#conn = type('foo', (object, ), {'rollback':lambda self:None, 'commit':lambda self:None})()
try:
    conn = sqlite3.connect(dbpath, isolation_level='EXCLUSIVE')
    # do something
    for i in range(10):
        conn.execute('insert into tbl values (?, ?)', [i, 'name%d' % i])
    #
except Exception, e:
    print e
    if conn: conn.rollback()
finally:
    if conn: conn.commit()

分離レベルは3つあります。*1

分離レベル設定値挙動
deferred'DEFERRED'読み込み処理時にSHAREDロックを、書き込み処理時にRESERVEDロックを取得する*2
immediate'IMMEDIATE'開始時にRESERVEDロックを取得する*3
exclusive'EXCLUSIVE'開始時にEXCLUSIVEロックを取得する*4
auto commitNoneトランザクションでない時のモード。DML発行前に暗黙的なトランザクションを開始し、DDL発行前にコミット(とどこかで読んだけど公式文書を見つけられない)

ロックの種類は http://www.sqlite.org/lockingv3.html#locking を参照。

また、ロックの粒度はデータベース全体です。*5



pythonアプリケーションのコードを書くときはここら辺が参考になります。

http://www.doughellmann.com/PyMOTW/sqlite3/

sqlite3の3つの分離レベル、DEFERRED, IMMEDIATE, EXCLUSIVEのそれぞれについて詳細な説明があります。しかもpythonのsqlite3による説明つき。




*1http://www.sqlite.org/lang_transaction.html

*2:"The first read operation against a database creates a SHARED lock and the first write operation creates a RESERVED lock."

*3:"RESERVED locks are acquired on all databases as soon as the BEGIN command is executed, without waiting for the database to be used"

*4:"no other database connection except for read_uncommitted connections will be able to read the database and no other connection without exception will be able to write the database until the transaction is complete. "

*5http://www.sqlite.org/whentouse.html "SQLite uses reader/writer locks on the entire database file."

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yatt/20120304/1330832666