MySQL: Mysql 事務隔離級別
阿新 • • 發佈:2021-07-14
資料併發訪問(瞭解)
一個數據庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫.
資料庫的相同資料可能被 多個事務同時訪問,如果不採取隔離措施,就會導致各種問題, 破壞資料的完整性
併發訪問會產生的問題
事務在操作時的理想狀態: 所有的事務之間保持隔離,互不影響。
因為併發操作,多個使用者同時訪問同 一個 資料。可能引發併發訪問的問題
併發訪問 的問題 | 說明 |
髒讀 | 一個事務讀取到了另一個事務中尚未提交的資料 |
不可重複 讀 | 一個事務中兩次讀取的資料內容不一致, 要求的是在一個事務中多次讀取時資料是一 致的. 這是進行 update 操作時引發的問題 |
幻讀 |
一個事務中,某一次的 select 操作得到的結果所表徵的資料狀態, 無法支撐後續的業務 操作. 查詢得到的資料狀態不準確,導致幻讀. |
四種隔離級別
通過設定隔離級別,可以防止上面的三種併發問題. MySQL資料庫有四種隔離級別 上面的級別最低,下面 的級別最高。
✔ 會出現問題
✘ 不會出現問題
級 別 | 名字 | 隔離級別 | 髒 讀 | 不可重複 讀 | 幻 讀 | 資料庫的預設隔離級 別 |
1 | 讀未提 交 | read uncommitted | ✔ | ✔ | ✔ | |
2 | 讀已提 交 | read committed | ✘ | ✔ | ✔ | Oracle和SQLServer |
3 | 可重複 讀 | repeatable read | ✘ | ✘ | ✔ | MySql |
4 | 序列化 | serializable | ✘ | ✘ | ✘ |
隔離級別相關命令
1) 檢視隔離級別
select @@tx_isolation;
2) 設定事務隔離級別,需要退出 MySQL 再重新登入才能看到隔離級別的變化
set global transaction isolation level 級別名稱; read uncommitted 讀未提交 read committed 讀已提交 repeatable read 可重複讀 serializable 序列化
例如: 修改隔離級別為 讀未提交
set global transaction isolation level read uncommitted;