文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SET TRANSACTION 陳述式

15.3.7 SET TRANSACTION 陳述式

SET [GLOBAL | SESSION] TRANSACTION
    transaction_characteristic [, transaction_characteristic] ...

transaction_characteristic: {
    ISOLATION LEVEL level
  | access_mode
}

level: {
     REPEATABLE READ
   | READ COMMITTED
   | READ UNCOMMITTED
   | SERIALIZABLE
}

access_mode: {
     READ WRITE
   | READ ONLY
}

此陳述式指定交易特性。它會接受一個或多個以逗號分隔的特性值清單。每個特性值都會設定交易的隔離等級或存取模式。隔離等級用於對 InnoDB 資料表執行的操作。存取模式指定交易是以讀寫模式或唯讀模式運作。

此外,SET TRANSACTION 可以包含一個可選的 GLOBALSESSION 關鍵字,以指示陳述式的範圍。

交易隔離等級

若要設定交易隔離等級,請使用 ISOLATION LEVEL level 子句。在同一個 SET TRANSACTION 陳述式中,不允許指定多個 ISOLATION LEVEL 子句。

預設隔離等級為 REPEATABLE READ。其他允許的值為 READ COMMITTEDREAD UNCOMMITTEDSERIALIZABLE。如需關於這些隔離等級的資訊,請參閱第 17.7.2.1 節,「交易隔離等級」

交易存取模式

若要設定交易存取模式,請使用 READ WRITEREAD ONLY 子句。在同一個 SET TRANSACTION 陳述式中,不允許指定多個存取模式子句。

預設情況下,交易會以讀寫模式進行,允許對交易中使用的資料表進行讀取和寫入。可以使用 SET TRANSACTION,並將存取模式設為 READ WRITE 來明確指定此模式。

如果交易存取模式設定為 READ ONLY,則禁止變更資料表。當不允許寫入時,這可能會讓儲存引擎進行效能提升。

在唯讀模式下,仍然可以使用 DML 陳述式來變更以 TEMPORARY 關鍵字建立的資料表。使用 DDL 陳述式所做的變更不允許,如同永久資料表一樣。

也可以使用 START TRANSACTION 陳述式,為個別交易指定 READ WRITEREAD ONLY 存取模式。

交易特性範圍

您可以全域、針對目前工作階段,或僅針對下一個交易設定交易特性。

  • 使用 GLOBAL 關鍵字

    • 此陳述式會全域套用於所有後續工作階段。

    • 現有的工作階段不受影響。

  • 使用 SESSION 關鍵字

    • 此陳述式會套用於目前工作階段中執行的所有後續交易。

    • 此陳述式允許在交易內使用,但不會影響目前正在進行的交易。

    • 如果在交易之間執行,此陳述式會覆寫任何先前的陳述式,這些陳述式會設定指定特性的下一個交易值。

  • 不使用任何 SESSIONGLOBAL 關鍵字

    • 此陳述式僅套用於工作階段中執行的下一個單一交易。

    • 後續交易會還原為使用指定特性的工作階段值。

    • 此陳述式不允許在交易內使用。

      mysql> START TRANSACTION;
      Query OK, 0 rows affected (0.02 sec)
      
      mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      ERROR 1568 (25001): Transaction characteristics can't be changed
      while a transaction is in progress

變更全域交易特性需要 CONNECTION_ADMIN 權限 (或已棄用的 SUPER 權限)。任何工作階段都可以自由變更其工作階段特性 (即使在交易中),或其下一個交易的特性 (在該交易開始之前)。

若要在伺服器啟動時設定全域隔離等級,請使用命令列或選項檔中的 --transaction-isolation=level 選項。此選項的 level 值會使用破折號而非空格,因此允許的值為 READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE

同樣地,若要在伺服器啟動時設定全域交易存取模式,請使用 --transaction-read-only 選項。預設值為 OFF (讀寫模式),但可以將該值設定為 ON 以設為唯讀模式。

例如,若要將隔離等級設定為 REPEATABLE READ,並將存取模式設定為 READ WRITE,請在選項檔的 [mysqld] 區段中使用以下幾行:

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF

在執行階段,可以使用 SET TRANSACTION 陳述式間接設定全域、工作階段和下一個交易範圍層級的特性,如先前所述。也可以使用 SET 陳述式,將值指派給 transaction_isolationtransaction_read_only 系統變數,來直接設定它們。

下表顯示了每個 SET TRANSACTION 和變數指派語法所設定的特性範圍層級。

表 15.9:交易特性的 SET TRANSACTION 語法

語法 受影響的特性範圍
SET GLOBAL TRANSACTION transaction_characteristic 全域
SET SESSION TRANSACTION transaction_characteristic 工作階段
SET TRANSACTION transaction_characteristic 僅限下一個交易

表 15.10:交易特性的 SET 語法

語法 受影響的特性範圍
SET GLOBAL var_name = value 全域
SET @@GLOBAL.var_name = value 全域
SET PERSIST var_name = value 全域
SET @@PERSIST.var_name = value 全域
SET PERSIST_ONLY var_name = value 無執行階段效果
SET @@PERSIST_ONLY.var_name = value 無執行階段效果
SET SESSION var_name = value 工作階段
SET @@SESSION.var_name = value 工作階段
SET var_name = value 工作階段
SET @@var_name = value 僅限下一個交易

可以在執行階段檢查交易特性的全域和工作階段值。

SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;