文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  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 語句中指定多個存取模式子句。

預設情況下,交易以讀/寫模式進行,允許對交易中使用的表格進行讀取和寫入。可以使用存取模式為 READ WRITESET TRANSACTION 顯式指定此模式。

如果將交易存取模式設定為 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;