##
5 トランザクション制御

デフォルトでは、`sqlite3` モジュールはデータ変更言語(DML)文(すなわち INSERT/UPDATE/DELETE/REPLACE)の前に暗黙のうちにトランザクションを開始し、 非DML、非クエリ文(すなわち SELECT/INSERT/UPDATE/DELETE/REPLACE のいずれでも ないもの)の前にトランザクションをコミットします。

ですから、もしトランザクション中に `CREATE TABLE ...`, `VACUUM`, `PRAGMA` といったコマンドを発行すると、`sqlite3` モジュールはその コマンドの実行前に暗黙のうちにコミットします。このようにする理由は二つあります。 第一にこうしたコマンドのうちの幾つかはトランザクション中ではうまく動きません。 第二に pysqlite はトランザクションの状態(トランザクションが掛かっているかどうか)を 追跡する必要があるからです。

pysqlite が暗黙のうちに実行する"BEGIN"文の種類(またはそういうものを使わないこと)を `connect` 呼び出しの isolation_level パラメータを通じて、または 接続の `isolation_level` プロパティを通じて、制御することができます。

もし自動コミットモードが使いたければ、`isolation_level` は None にしてください。

そうでなければデフォルトのまま"BEGIN"文を使い続けるか、SQLite がサポートする分離レベル DEFERRED, IMMEDIATE または EXCLUSIVE を設定してください。

`sqlite` モジュールがトランザクション状態を把握する必要があるの で、SQL の中で `OR ROLLBACK` や `ON CONFLICT ROLLBACK` を使っ てはなりません。その代わりに、`IntegrityError` を捕捉して接続 の`rollback` メソッドを自分で呼び出すようにしてください。