テーブルを作成し、新しいエントリを別のテーブルに挿入したい場合、これを sqlite モジュールでアトミックにすることはできますか?
http://docs.python.org/2/library/sqlite3.htmlのドキュメントを参照:
デフォルトでは、sqlite3 モジュールは、データ変更言語 (DML) ステートメント (つまり、INSERT/UPDATE/DELETE/REPLACE) の前に暗黙的にトランザクションを開き、非 DML、非クエリ ステートメント (つまり、SELECT またはステートメント以外のもの) の前に暗黙的にトランザクションをコミットします。前述の)。
したがって、トランザクション内で CREATE TABLE ...、VACUUM、PRAGMA などのコマンドを発行すると、sqlite3 モジュールはそのコマンドを実行する前に暗黙的にコミットします。そうする理由は2つあります。1 つ目は、これらのコマンドの一部がトランザクション内で機能しないことです。もう 1 つの理由は、sqlite3 がトランザクションの状態を追跡する必要があるためです (トランザクションがアクティブかどうか)。
この 2 番目の段落が、自動的に開始されたトランザクションに適用されるのか、それとも手動と自動のトランザクションの両方に適用されるのかはわかりません。
Sqlite ドキュメントhttp://www.sqlite.org/lang_transaction.htmlは、明示的な COMMIT まで手動トランザクションがコミットされないことを示しています。
トランザクションは、BEGIN コマンドを使用して手動で開始できます。このようなトランザクションは通常、次の COMMIT または ROLLBACK コマンドまで存続します。
したがって、次のようなものがあるとします。
con = sqlite3.connect(fdb)
cur = con.cursor()
sql = 'begin transaciton'
cur.execute(sql)
sql = 'CREATE TABLE some-table ...
cur.execute(sql)
# *** is there an implicit commit at this point ?! ***
sql = 'INSERT INTO another-table ...
cur.execute(sql)
con.commit()
これはアトミックですか、それとも python sqlite はcreate table
ステートメントの後にコミットしますか? アトミックにする方法はありますか?