Python アプリケーションでのコミット・モード

接続リソースのコミット・モードを指定することにより、SQL ステートメントのグループがコミットされる方法を制御できます。 ibm_db API は自動コミットと手動コミットの 2 つのコミット・モードをサポートしています。

自動コミット・モード
自動コミット・モードでは、各 SQL ステートメントはそれだけで完結するトランザクションであり、自動的にコミットされます。 自動コミット・モードは、スケーラビリティーが必要な Web アプリケーションのパフォーマンスを阻害するロック・エスカレーションの問題を防ぐのに役立ちます。 デフォルトでは、ibm_db API はそれぞれの接続を自動コミット・モードで開きます。

自動コミット・モードが使用不可の場合、ibm_db.autocommit(conn, ibm_db.SQL_AUTOCOMMIT_ON) (ここで、conn は有効な接続リソース) を呼び出すことにより、自動コミット・モードを使用可能にすることができます。

ibm_db.autocommit 関数を呼び出すと、Python とデータベース管理システムの間の追加の通信が必要となるため、Python スクリプトのパフォーマンスが影響を受ける可能性があります。

手動コミット・モード
手動コミット・モードでは、ibm_db.commit または ibm_db.rollback 関数を呼び出したときにトランザクションが終了します。 つまり、トランザクションの開始から commit または rollback 関数の呼び出しまでの間に同じ接続に対して実行されるすべてのステートメントは、単一のトランザクションとして扱われます。

手動コミット・モードは、1 つ以上の SQL ステートメントを含むトランザクションをロールバックする必要がある場合に役立ちます。 SQL ステートメントをトランザクション内で実行し、明示的にトランザクションをコミットまたはロールバックせずにスクリプトが終了する場合には、ibm_db 拡張モジュールはトランザクション内で実行されたすべての作業を自動的にロールバックします。

ibm_db.connect または ibm_db.pconnect オプション配列の { ibm_db.SQL_ATTR_AUTOCOMMIT: ibm_db.SQL_AUTOCOMMIT_OFF } 設定を使用してデータベース接続を作成するときに、自動コミット・モードをオフにすることができます。 また、ibm_db.autocommit(conn, ibm_db.SQL_AUTOCOMMIT_OFF) (ここで conn は有効な接続リソース) を呼び出すことにより、接続リソースの自動コミット・モードをオフにすることができます。

ibm_db API について詳しくは、 http://code.google.com/p/ibm-db/wiki/APIsを参照してください。

自動コミット・モードをオフにして、ibm_db.commit または ibm_db.rollback が呼び出されたときにトランザクションを終了します。

import ibm_db

array = { ibm_db.SQL_ATTR_AUTOCOMMIT : ibm_db.SQL_AUTOCOMMIT_OFF }
conn = ibm_db.pconnect("SAMPLE", "user", "password", array)
sql = "DELETE FROM EMPLOYEE"
try:
   stmt = ibm_db.exec_immediate(conn, sql)
except:
   print "Transaction couldn't be completed."
   ibm_db.rollback(conn)
else:
   ibm_db.commit(conn)
   print "Transaction complete."