Mysql 隔離級別配置修改

2021-10-08 08:58:18 字數 3508 閱讀 2255

題外話

在日常的mysql管理中,一旦確定好隔離級別,很少會去修改的,但遇到特殊情況需做修改,本文介紹了mysql 四種隔離級別的含義和持久化修改方法。

事務具有四個特徵:原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。這四個特性簡稱為 acid 特性。

1 、原子性。事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做

2 、一致性。事 務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統 執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是 不一致的狀態。

3 、隔離性。乙個事務的執行不能其它事務干擾。即乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。

4 、持續性。也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

在mysql中,實現了這四種隔離級別,分別有可能產生問題如下所示:

# 檢視隔離級別

select @@global.transaction_isolation;

select @@session.transaction_isolation;

show variables like '%iso%'

;# 設定全域性隔離級別

set global transaction isolation level repeatable read;

set global transaction isolation level read committed;

set global transaction isolation level read uncommitted;

set global transaction isolation level serializable;

# 設定會話隔離級別

set session transaction isolation level repeatable read;

set session transaction isolation level read committed;

set session transaction isolation level read uncommitted;

set session transaction isolation level serializable;

#通過配置檔案設定隔離級別(重啟生效)

[mysqld]

transaction-isolation = repeatable-read

transaction-isolation = read-committed

transaction-isolation = read-uncommitted

transaction-isolation = serializable

實踐

#檢視當前隔離級別

mysql> select @@global.transaction_isolation;

+--------------------------------+

| @@global.transaction_isolation |

+--------------------------------+

| repeatable-read |

+--------------------------------+

1 row in set (0.00 sec)

#設定個隔離級別為rc

mysql> set global transaction isolation level read committed;

query ok, 0 rows affected (0.00 sec)

#再次檢視隔離級別,設定成功 **注意要新開會話再檢視**

mysql> select @@global.transaction_isolation;

+--------------------------------+

| @@global.transaction_isolation |

+--------------------------------+

| read-committed |

+--------------------------------+

1 row in set (0.00 sec)

#相應隔離級別引數加入配置檔案(保證重啟持久化)

[mysqld]

......

transaction-isolation=read-committed

哎喲,不錯噢! - - - - - - 歡迎指出有誤的地方以及補充更好的方法

檢視修改mysql隔離級別

1.檢視 mysql 8.0 系統級別 select global.transaction isolation 會話級別 select transaction isolation mysql 5.0 select global.tx isolation 2.修改 set global transac...

MySQL事務隔離級別詳解 修改

參考 和 sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實...

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...