MySQL的自動提交模式

 

 

默認狀況下, MySQL啓用自動提交模式(變量autocommitON)。這意味着, 只要你執行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 transactionbegin, 在自動提交模式關閉(關閉隱式提交)的狀況下,開啓一個事務上下文。首先數據庫會隱式提交以前的還未被提交的操做,同時開啓一個新事務。若有不明,能夠用下面小實驗理解一下:

 

測試以下所示:

 

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中查看,此時能夠查詢到會話ID1的事務信息, 以下所示

 

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操做已經提交。

 

 

clip_image001

 

 

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,自動提交將保持禁用狀態,直到你使用COMMITROLLBACK結束事務。 自動提交模式而後恢復到以前的狀態(若是start transaction autocommit = 1,則完成本次事務後 autocommit 仍是 1。若是 start transaction autocommit = 0,則完成本次事務後 autocommit 仍是 0

 

 

 

 

參考資料:

 

https://dev.mysql.com/doc/refman/5.7/en/commit.html

相關文章
相關標籤/搜索