預設情況下, MySQL啟用自動提交模式(變數autocommit為ON)。這意味著, 只要你執行DML操作的語句,MySQL會立即隱式提交事務(Implicit Commit)。這個跟SQL Server基本是類似的。如果你瞭解SQL Server資料庫的話。 查看autocommit模式 由於變... ...
預設情況下, MySQL啟用自動提交模式(變數autocommit為ON)。這意味著, 只要你執行DML操作的語句,MySQL會立即隱式提交事務(Implicit Commit)。這個跟SQL Server基本是類似的。如果你瞭解SQL Server資料庫的話。
查看autocommit模式
由於變數autocommit分會話系統變數與全局系統變數,所以查詢的時候,最好區別是會話系統變數還是全局系統變數。
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模式
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服務重啟的話,這些設置就會丟失,如果要永久生效,就必須在配置文件中修改系統變數。
[mysqld]
autocommit=0
不過網上還有種方式,如下所示,我在MySQL 5.6/5.7下測試,發現不生效,查了一下,這種方式似乎從MySQL 5.6開始已經不生效了,必須用autocommit=0這種方式替換。
[mysqld]
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)