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
語句中指定多個存取模式子句。
預設情況下,交易以讀/寫模式進行,允許對交易中使用的表格進行讀取和寫入。可以使用存取模式為 READ WRITE
的 SET TRANSACTION
顯式指定此模式。
如果將交易存取模式設定為 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;