1. 程式人生 > MYSQL進階教學 ><p>MySQL 中的事務控制機制</p>

<p>MySQL 中的事務控制機制</p>

事務控制是 MySQL 的重要特性之一。在 MySQL 中,InnoDB 和 NDB Cluster 是常見的事務型儲存引擎。

1. 自動提交

預設情況下,MySQL 是自動提交(autocommit)的。也就意味著:如果不是顯式地開始一個事務,每個查詢都會被當做一個事務執行 commit。這是和 Oracle 的事務管理明顯不同的地方,如果應用是從Oracle 資料庫遷移至 MySQL 資料庫,則需要確保應用中是否對事務進行了明確的管理

在當前連線中,可以通過設定 autocommit 來修改自動提交模式:

mysql> show variables like 'autocommit'
; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> set autocommit = 1; Query OK, 0 rows affected (0.00 sec) -- 1或ON表示啟用自動提交模式,0或OFF表示禁用自動提交模式

如果設定了autocommit=0,當前連線所有事務都需要通過明確的命令來提交或回滾。

對於 MyISAM 這種非事務型的表,修改 autocommit 不會有任何影響,因為非事務型的表,沒有 commit或 rollback 的概念,它會一直處於 autocommit 啟用的狀態。

有些命令,在執行之前會強制執行 commit 提交當前連線的事務。比如 DDL 中的 alter table,以及lock tables 等語句。

2. 隔離級別調整

預設情況下,MySQL 的隔離級別是可重複讀(repeatable read)。MySQL 可以通過 set transaction_isolation 命令來調整隔離級別,新的隔離級別會在下一個事務開始時生效。

調整隔離級別的方法有兩種:

  • 臨時:在 MySQL 中直接用命令列執行:

    mysql> show variables like 'transaction_isolation';
    +-----------------------+-----------------+
    | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec) mysql> SET transaction_isolation = 'REPEATABLE-READ'; Query OK, 0 rows affected (0.00 sec)
  • 永久:將以下兩個引數新增至配置檔案 my.cnf,並重啟 MySQL:

    transaction_isolation = 'REPEATABLE-READ'
    

3. 事務中使用不同的儲存引擎

MySQL 的服務層並不負責事務的處理,事務都是由儲存引擎層實現。

在同一事務中,使用多種儲存引擎是不可靠的,尤其在事務中混合使用了事務型和非事務型的表。如同一事務中,使用了 InnoDB 和 MyISAM 表:

  • 如果事務正常提交,不會有什麼問題;
  • 如果事務遇到異常需要回滾,非事務型的表就無法撤銷表更,這就會直接導致資料處於不一致的狀態。

4. 小結

本小節主要介紹了 MySQL 中事務控制的一些特點,如何調整自動提交(autocommit)、如何調整隔離級別調整、以及講解了在事務中使用混合儲存引擎的缺點。