Mysql 8查看並修改事務隔離級別

Mysql 8的默認事務隔離級別爲REPEATABLE-READ(重複讀)

官方文檔13.3.7 SET TRANSACTION Statement

查看事務隔離級別

MySQL8查詢事務應該使用transaction_isolation,tx_isolation在MySQL 5.7.20後被棄用。

-- 登錄mysql
mysql -uroot -p

-- 輸入以下命令查看事務隔離級別,其中transaction_isolation就是隔離級別
mysql> show variables like 'transaction%';
+----------------------------------+-----------------+
| Variable_name                    | Value           |
+----------------------------------+-----------------+
| transaction_alloc_block_size     | 8192            |
| transaction_allow_batching       | OFF             |
| transaction_isolation            | REPEATABLE-READ |
| transaction_prealloc_size        | 4096            |
| transaction_read_only            | OFF             |
| transaction_write_set_extraction | XXHASH64        |
+----------------------------------+-----------------+

-- 或使用sql查看
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+

修改事務隔離級別

數據庫事務的隔離級別有4種,由低到高分別爲read uncommitted(讀未提交) 、read committed(讀提交) 、repeatable read(重複讀) 、Serializable(序列化) 。

語法

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
}

使用說明

This statement sets the transaction isolation level globally, for the current session, or for the next transaction:

·With the GLOBAL keyword, the statement sets the default transaction level globally for all subsequent sessions. Existing sessions are unaffected.

·With the SESSION keyword, the statement sets the default transaction level for all subsequent transactions performed within the current session.

·Without any SESSION or GLOBAL keyword, the statement sets the isolation level for the next (not started) transaction performed within the current session.
使用例子

設置本次會話的事務隔離級別,只在本會話有效,不會影響到其它會話

-- 設置本次會話的事務隔離級別,只在本會話有效,不會影響到其它會話
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

-- 再次查看發現已改成了read committed
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED          |
+-------------------------+
-- 再登錄其它窗口,再查看,發現還是repeatable read
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+

設置全局的事務隔離級別,該設置不會影響當前已經連接的會話,設置完畢後,新打開的會話,將使用新設置的事務隔離級別

-- 設置全局的事務隔離級別
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

-- 不影響本次已連接會話的事務,所以查到的還是修改前的
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
-- 再打開一個新會話,則變成了修改後的read committed
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED          |
+-------------------------+

設置下一次事務操作的隔離級別,該設置會隨着下一次事務的提交而失效

-- 查看自動提交是否開啓
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
-- 關閉自動提交
mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+

-- 設置本次事務
set transaction isolation level read uncommitted;

-- 提交事務
commit;

通過配置文件my.ini也可以修改事務

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
發佈了115 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章