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
可以包含一個可選的 GLOBAL
或 SESSION
關鍵字,以指示陳述式的範圍。
若要設定交易隔離等級,請使用 ISOLATION LEVEL
子句。在同一個 level
SET TRANSACTION
陳述式中,不允許指定多個 ISOLATION LEVEL
子句。
預設隔離等級為 REPEATABLE READ
。其他允許的值為 READ COMMITTED
、READ UNCOMMITTED
和 SERIALIZABLE
。如需關於這些隔離等級的資訊,請參閱第 17.7.2.1 節,「交易隔離等級」。
若要設定交易存取模式,請使用 READ WRITE
或 READ ONLY
子句。在同一個 SET TRANSACTION
陳述式中,不允許指定多個存取模式子句。
預設情況下,交易會以讀寫模式進行,允許對交易中使用的資料表進行讀取和寫入。可以使用 SET TRANSACTION
,並將存取模式設為 READ WRITE
來明確指定此模式。
如果交易存取模式設定為 READ ONLY
,則禁止變更資料表。當不允許寫入時,這可能會讓儲存引擎進行效能提升。
在唯讀模式下,仍然可以使用 DML 陳述式來變更以 TEMPORARY
關鍵字建立的資料表。使用 DDL 陳述式所做的變更不允許,如同永久資料表一樣。
也可以使用 START TRANSACTION
陳述式,為個別交易指定 READ WRITE
和 READ ONLY
存取模式。
您可以全域、針對目前工作階段,或僅針對下一個交易設定交易特性。
使用
GLOBAL
關鍵字此陳述式會全域套用於所有後續工作階段。
現有的工作階段不受影響。
使用
SESSION
關鍵字此陳述式會套用於目前工作階段中執行的所有後續交易。
此陳述式允許在交易內使用,但不會影響目前正在進行的交易。
如果在交易之間執行,此陳述式會覆寫任何先前的陳述式,這些陳述式會設定指定特性的下一個交易值。
不使用任何
SESSION
或GLOBAL
關鍵字此陳述式僅套用於工作階段中執行的下一個單一交易。
後續交易會還原為使用指定特性的工作階段值。
此陳述式不允許在交易內使用。
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-UNCOMMITTED
、READ-COMMITTED
、REPEATABLE-READ
或 SERIALIZABLE
。
同樣地,若要在伺服器啟動時設定全域交易存取模式,請使用 --transaction-read-only
選項。預設值為 OFF
(讀寫模式),但可以將該值設定為 ON
以設為唯讀模式。
例如,若要將隔離等級設定為 REPEATABLE READ
,並將存取模式設定為 READ WRITE
,請在選項檔的 [mysqld]
區段中使用以下幾行:
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
在執行階段,可以使用 SET TRANSACTION
陳述式間接設定全域、工作階段和下一個交易範圍層級的特性,如先前所述。也可以使用 SET
陳述式,將值指派給 transaction_isolation
和 transaction_read_only
系統變數,來直接設定它們。
SET TRANSACTION
允許使用可選的GLOBAL
和SESSION
關鍵字,在不同的範圍層級設定交易特性。用於將值指派給
transaction_isolation
和transaction_read_only
系統變數的SET
陳述式具有在不同範圍層級設定這些變數的語法。
下表顯示了每個 SET TRANSACTION
和變數指派語法所設定的特性範圍層級。
表 15.9:交易特性的 SET TRANSACTION 語法
語法 | 受影響的特性範圍 |
---|---|
SET GLOBAL TRANSACTION |
全域 |
SET SESSION TRANSACTION |
工作階段 |
SET TRANSACTION |
僅限下一個交易 |
表 15.10:交易特性的 SET 語法
語法 | 受影響的特性範圍 |
---|---|
SET GLOBAL |
全域 |
SET @@GLOBAL. |
全域 |
SET PERSIST |
全域 |
SET @@PERSIST. |
全域 |
SET PERSIST_ONLY |
無執行階段效果 |
SET @@PERSIST_ONLY. |
無執行階段效果 |
SET SESSION |
工作階段 |
SET @@SESSION. |
工作階段 |
SET |
工作階段 |
SET @@ |
僅限下一個交易 |
可以在執行階段檢查交易特性的全域和工作階段值。
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;