mysql(一) MySQL設置事務自動提交(開啓和關閉)

   MySQL 默認開啓事務自動提交模式,即除非顯式的開啓事務(BEGIN 或 START TRANSACTION),否則每條 SOL 語句都會被當做一個單獨的事務自動執行。但有些情況下,我們需要關閉事務自動提交來保證數據的一致性。下面主要介紹如何設置事務自動提交模式。

mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set, 1 warning (0.04 sec)

結果顯示,autocommit 的值是 ON,表示系統開啓自動提交模式。

在 MySQL 中,可以使用 SET autocommit 語句設置事務的自動提交模式,語法格式如下:

SET autocommit = 0|1|ON|OFF;

對取值的說明:

值爲 0 和值爲 OFF:關閉事務自動提交。如果關閉自動提交,用戶將會一直處於某個事務中,只有提交或回滾後纔會結束當前事務,重新開始一個新事務。
值爲 1 和值爲 ON:開啓事務自動提交。如果開啓自動提交,則每執行一條 SQL 語句,事務都會提交一次。

示例

下面我們關閉事務自動提交,模擬銀行轉賬。

使用 SET autocommit 語句關閉事務自動提交,且張三轉給李四 500 元,SQL 語句和運行結果如下:

mysql> SET autocommit = 0;                                                      ;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 張三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)
mysql> UPDATE bank SET currentMoney = currentMoney-500 WHERE customerName='張三' ;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> UPDATE bank SET currentMoney = currentMoney+500 WHERE customerName='李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

這時重新打開一個 cmd 窗口,查看 bank 數據表中張三和李四的餘額,SQL 語句和運行結果如下所示:
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 張三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

結果顯示,張三和李四的餘額是事務執行前的數據。

下面在之前的窗口中使用 COMMIT 語句提交事務,並查詢 bank 數據表的數據,如下所示:

mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 張三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

結果顯示,bank 數據表的數據更新成功。

   在本例中,關閉自動提交後,該位置會作爲一個事務起點,直到執行 COMMIT 語句和 ROLLBACK 語句後,該事務才結束。結束之後,這就是下一個事務的起點。

   關閉自動提交功能後,只用當執行 COMMIT 命令後,MySQL 纔將數據表中的資料提交到數據庫中。如果執行 ROLLBACK 命令,數據將會被回滾。如果不提交事務,而終止 MySQL 會話,數據庫將會自動執行回滾操作。

   使用 BEGIN 或 START TRANSACTION 開啓一個事務之後,自動提交將保持禁用狀態,直到使用 COMMIT 或 ROLLBACK 結束事務。之後,自動提交模式會恢復到之前的狀態,即如果 BEGIN 前 autocommit = 1,則完成本次事務後 autocommit 還是 1。如果 BEGIN 前 autocommit = 0,則完成本次事務後 autocommit 還是 0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章