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.