MySQLでオートコミットを無効化する
MySQLのMLで質問が飛んできていたので、レスついでにblogにも書いておく。
MySQLではInnoDBやNDB Clusterなどのストレージエンジンでトランザクションをサポートする。この際、Oracleなどに慣れた人からするとトランザクションのオートコミット(autocommit)でハマる場合がある。というのも、MySQLでは「autocommit=1」がデフォルトの設定となっており、トランザクションを開始する場合には、DML実行前にSTART TRANSACSTION文を実行する必要がある。今回は、これが不都合な場合の対処方法について説明する。
MySQLでは、オートコミットをオフにするためのシステムパラメータは用意されていない。ではどうするか?MySQL 4.1以降のバージョンでは、同じことを実現するための方法として「init_connect」パラメータを使用する方法がある。このパラメータはDBへの接続確立後、最初に実行されるSQLを指定するもの。パラメータの詳細はマニュアル(5.1.3. Server System Variables-init_connect)以下をご覧ください。
具体的には、my.cnf(Windowsプラットフォームではmy.ini)で
と設定することで実現できる。
init_connect='set autocommit=0'
ただし、init_connectパラメータで指定したSQLはSUPER権限をもつユーザ(rootユーザなど)に対しては実行されないため、注意が必要。以下はマニュアルの注意書き部分の引用。
Note that the content of init_connect is not executed for users
that have the SUPER privilege.