| この記事の要点 |
|
オートコミットとは
オートコミット(autocommit)は、INSERT・UPDATE・DELETE などのデータ変更(DML)を実行した直後に、データベースが自動的に COMMIT を行う動作のことです。MariaDB・MySQL ではどちらも既定で ON になっており、ふだん mysql コマンドで UPDATE を打つと、その瞬間に変更が確定して他の接続からも見えるようになります。
オートコミットが OFF の場合は、最初の DML を実行した時点でトランザクションが暗黙的に始まり、明示的に COMMIT するまで変更は確定しません。ROLLBACK で取り消すこともできます。なお、トランザクションに対応しているのは InnoDB などのストレージエンジンだけで、MyISAM のテーブルはオートコミットの設定にかかわらず即時に反映されます。
現在の設定を確認する方法
以下のどちらかで、今の接続(セッション)のオートコミット設定を確認できます。
> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
SELECT @@session.autocommit, @@global.autocommit;
@@session は今の接続の値、@@global は新しく接続したときに使われる既定値です。1 が ON、0 が OFF を意味します。
設定を変更する方法
変更したい範囲によって方法が 3 つあります。
| 範囲 | 方法 | 有効期間 |
|---|---|---|
| 今の接続だけ | SET autocommit = 0; | 切断するまで |
| 以降の新しい接続すべて | SET GLOBAL autocommit = 0;(管理者権限が必要) | サーバー再起動まで。実行中の既存接続には効かない |
| サーバーの既定値 | 設定ファイルの [mysqld] に記述して再起動 | 恒久的 |
今の接続だけ切り替える
OFF にしたい場合は 0、ON に戻したい場合は 1 を指定します(OFF / ON と書いても同じです)。
> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)
> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
サーバーの既定値を変える(my.cnf)
設定ファイル(Linux なら /etc/my.cnf や /etc/mysql/my.cnf 配下、Windows なら my.ini など。配置はディストリビューションやインストール方法で異なります)の [mysqld] セクションに追記し、サービスを再起動します。
[mysqld]
autocommit=0
再起動後、新しく接続して SELECT @@autocommit; が 0 になっていれば反映されています。
設定を変えずに複数の更新をまとめる方法
「複数の UPDATE を一括で確定したい」「失敗したら全部取り消したい」という目的なら、オートコミットを OFF にするより、必要な箇所だけトランザクションを明示するほうが安全です。START TRANSACTION(または BEGIN)を実行すると、その時点から COMMIT か ROLLBACK までの間だけオートコミットが止まります。
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE id = 1;
UPDATE account SET balance = balance + 1000 WHERE id = 2;
-- 結果を確認して問題なければ確定
COMMIT;
-- 取り消す場合は ROLLBACK;
オートコミットを OFF にするときの注意点
- COMMIT 忘れで変更が消える: OFF のまま切断すると、未コミットの変更はロールバックされます。作業の最後に必ず COMMIT します
- ロックが残り続ける: UPDATE した行のロックはトランザクション終了まで保持されます。開きっぱなしのセッションがあると、他の処理が待たされたり、ALTER TABLE がメタデータロック待ちで止まったりします
- 暗黙のコミットがある: CREATE TABLE・ALTER TABLE・DROP TABLE・TRUNCATE などの DDL を実行すると、それまでの変更はその場でコミットされます。ROLLBACK では戻せません
- autocommit を 1 に戻すとコミットされる: トランザクション中に
SET autocommit = 1;を実行すると、その時点の変更が確定します - アプリ側の既定値は別物: 接続ライブラリによって既定値が異なります。たとえば JDBC や PHP の PDO は通常オートコミット有効ですが、Python の DB-API 準拠ドライバ(mysqlclient、PyMySQL など)は既定で無効のため
conn.commit()が必要です。サーバー側の設定だけで判断しないようにします
よくある質問
SET GLOBAL したのに今の画面で OFF にならない
SET GLOBAL はこれから接続するセッションの既定値を変えるもので、実行した接続自身には反映されません。今の接続も変えたい場合は SET autocommit = 0; も実行します。
本番環境では OFF にすべき?
一般的には ON のまま運用し、まとめて確定したい処理だけアプリ側でトランザクションを張るのが主流です。サーバー全体を OFF にすると、COMMIT を前提としていないツールやバッチの変更が確定しなくなるおそれがあります。
関連
- SQL トランザクション制御 完全ガイド(BEGIN/COMMIT/ROLLBACK/SAVEPOINT/ACID/分離レベル)
- SQL COMMIT 文 完全ガイド
- SQL ROLLBACK 完全ガイド
- MySQL の現在設定を確認するコマンド一覧
- DB トランザクション完全ガイド
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38