默認狀況下, MySQL啓用自動提交模式(變量autocommit爲ON)。這意味着, 只要你執行DML操做的語句,MySQL會當即隱式提交事務(Implicit Commit)。這個跟SQL Server基本是相似的。若是你瞭解SQL Server數據庫的話。html
查看autocommit模式mysql
因爲變量autocommit分會話系統變量與全局系統變量,因此查詢的時候,最好區別是會話系統變量仍是全局系統變量。sql
mysql> show session variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show global variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
Value的值爲ON,表示autocommit開啓。OFF表示autocommit關閉。數據庫
修改autocommit模式session
mysql> set session autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show session variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show global variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.01 sec)
mysql>
注意,上述SQL修改會話系統變量或全局系統變量,只對當前實例有效,若是MySQL服務重啓的話,這些設置就會丟失,若是要永久生效,就必須在配置文件中修改系統變量。app
[mysqld] 測試
autocommit=0spa
不過網上還有種方式,以下所示,我在MySQL 5.6/5.7下測試,發現不生效,查了一下,這種方式彷佛從MySQL 5.6開始已經不生效了,必須用autocommit=0這種方式替換。code
[mysqld] orm
init_connect='SET autocommit=0'
autocommit與顯性事務的關係
對於顯性事務start transaction或begin, 在自動提交模式關閉(關閉隱式提交)的狀況下,開啓一個事務上下文。首先數據庫會隱式提交以前的還未被提交的操做,同時開啓一個新事務。若有不明,能夠用下面小實驗理解一下:
測試以下所示:
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 1 |
+-----------------+
1 row in set (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from MyDB.test where name='kerry';
Query OK, 1 row affected (0.00 sec)
此時在會話2中查看,此時能夠查詢到會話ID爲1的事務信息, 以下所示
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 2 |
+-----------------+
1 row in set (0.00 sec)
mysql> SELECT a.trx_state,
-> b.event_name,
-> a.trx_started,
-> b.timer_wait / 1000000000000 timer_wait,
-> a.trx_mysql_thread_id blocking_trx_id,
-> b.sql_text
-> FROM information_schema.innodb_trx a,
-> performance_schema.events_statements_current b,
-> performance_schema.threads c
-> WHERE a.trx_mysql_thread_id = c.processlist_id
-> AND b.thread_id = c.thread_id;
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
| trx_state | event_name | trx_started | timer_wait | blocking_trx_id | sql_text |
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
| RUNNING | statement/sql/delete | 2018-03-23 14:55:00 | 0.0010 | 1 | delete from MyDB.test where name='kerry' |
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
1 row in set (0.00 sec)
若是在會話1當中開啓顯性事務,那麼以前掛起的事務會自動提交,而後,你再去會話2當中查詢,就發現以前的DELETE操做已經提交。
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 2 |
+-----------------+
1 row in set (0.00 sec)
mysql> SELECT a.trx_state,
-> b.event_name,
-> a.trx_started,
-> b.timer_wait / 1000000000000 timer_wait,
-> a.trx_mysql_thread_id blocking_trx_id,
-> b.sql_text
-> FROM information_schema.innodb_trx a,
-> performance_schema.events_statements_current b,
-> performance_schema.threads c
-> WHERE a.trx_mysql_thread_id = c.processlist_id
-> AND b.thread_id = c.thread_id;
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
| trx_state | event_name | trx_started | timer_wait | blocking_trx_id | sql_text |
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
| RUNNING | statement/sql/delete | 2018-03-23 14:55:00 | 0.0010 | 1 | delete from MyDB.test where name='kerry' |
+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT a.trx_state,
-> b.event_name,
-> a.trx_started,
-> b.timer_wait / 1000000000000 timer_wait,
-> a.trx_mysql_thread_id blocking_trx_id,
-> b.sql_text
-> FROM information_schema.innodb_trx a,
-> performance_schema.events_statements_current b,
-> performance_schema.threads c
-> WHERE a.trx_mysql_thread_id = c.processlist_id
-> AND b.thread_id = c.thread_id;
Empty set (0.00 sec)
With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state
使用START TRANSACTION,自動提交將保持禁用狀態,直到你使用COMMIT或ROLLBACK結束事務。 自動提交模式而後恢復到以前的狀態(若是start transaction 前 autocommit = 1,則完成本次事務後 autocommit 仍是 1。若是 start transaction 前 autocommit = 0,則完成本次事務後 autocommit 仍是 0)
參考資料:
https://dev.mysql.com/doc/refman/5.7/en/commit.html