mysql 筆記 隔離級別 事務

2022-07-02 22:45:16 字數 2603 閱讀 1246

1 隔離級別:低階別的隔離通常可以執行更高的併發,系統 開銷也更低

2 read uncommitted:事務可以讀取未提交的資料,髒讀,應少用

3 read committed:不可重複讀,事務只能看見已提交的事務所做的修改,大多數資料庫使用這一級別,mysql不是

4 repeatable read: 可重複讀,在同乙個事務中多次讀取同樣記錄結果是一致的。可能幻讀:指當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該 範圍內的記錄時,會產生幻行。

mysql 預設的事務隔離級別

5 serializable:可序列化 ,會在讀取的每一行資料上加鎖,可能導致大量的超時和鎖爭的問題。是最高的隔離級別,通過強制事務序列執行,避免了前面說的幻讀的問題。

實際少用,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下才考慮

6 鎖:兩個或多個事務在同一資源上相互占用,並請求鎖對方占用的資源,多個事務試圖以不同的順序鎖定資源時或多個事務同時鎖定乙個資源時,產生死鎖。

innodb處理方式:將持有最少行級排他鎖的事務進行回滾

鎖的行為和順序是和儲存引擎相著的。以同樣的順序執行語句,有些引擎會產生死鎖,有些則不會。死鎖產生有雙重原因,有些是真正的資料衝突,難避免,有些則是由於儲存引擎的實現方式導致的。

打破死鎖:部分或全部回滾其中的乙個事務

7 mysql提供了兩種事務型的引擎:innodb ndbcluster

第三方存在引擎 :xtradb pbxt

自動提交:mysql預設採用自動提交模式,可以用show variables like 'autocommit'; 可看,set autocommit=1 ; 開啟

1 或者 on 表示 啟用;0 或 off 表示禁用

autocommit=0時,所有的查詢都是在乙個事務中,直到顯式的執行commit 提交或rollback回滾該事務結束同時又開始乙個新的事務。

對於非事務型的表:myisam或 記憶體表,不會有影響,一直處於autocommit啟用模式,另外有些偽命令在執行前會強制執行commit提交當前事務:alter table .lock table

mysql可以通過執行 set transaction isolation level命令設定隔離級別,新的隔離級別會在下乙個事務開始時生效,可以在配置檔案中設定整個資料庫的隔離級別,也可以只改變當前會話的隔離級別

set session transaction isolation level read committed 

mysql能夠識別所有的4個anst隔離級別,innodb引擎也支援所有的隔離級別

8 在事務中混合使用儲存引擎:mysql伺服器層不管理事務,事務是由下層的儲存引擎實現的。所以在同一事務中,使用多種儲存引擎是不可靠的。回滾時非事務型的表上的變更不能被回滾。

9 innodb 採用2階段鎖定協議,在事務執行過賬中,隨時都可以執行鎖定,鎖只有在執行commit或者rollback的時候才會釋放,並且所有的鎖是在同一時刻被釋放。innodb會根據隔離級別在需要的時候自動加鎖

innodb也支援通過特定的語句顯式鎖定,這些語句不屬於sql規範:select ....lock inshare mode; select ... for update

mysql 也支援lock tables unlock tables 語句,這是在伺服器層實現的,和儲存引擎無關。不冊 替代事務處理。

innodb的行級鎖工作得比lock table語句好。在innodb中的可以去掉lock table語句

10 多版本併發控制:mvcc 通過儲存某個時間點的快照來實現的

分:樂觀併發控制

悲觀併發控制

innodb 的mvcc是通過在每行記錄後面儲存2個隱藏的列來實現的。乙個儲存行的建立時間,乙個儲存行的過期時間或刪除時間。儲存的是系統版本號。每開始乙個新的事務、系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢列的每行記錄的版本號進行比較。

repeatable read隔離級別下:

select  innodb 根據2個條件檢查每行記錄:

1 查詢版本早於當前事務版本的資料行

2 行的刪除版本要麼未定義,要麼大於當前事務版本號。只有符合2個條件才返回作為查詢結果

insert :為新增插入的每一行儲存當前系統版本號作為行版本號

delete:為刪除的每一行儲存當前系統版本號作為行刪除標識

update: 為插入一行新記錄儲存當前系統版本號作為版本號,同時儲存當前系統版本號到原來的行作為刪除標識。

mvcc只在repeatable read/read committed下工作

innodb的資料儲存在表空間table space中,表空間由一系列的資料檔案組成。innodb可以將每個表的資料和索引存放在單獨的檔案中。採用mvcc支援高交發且實現了4個標準的隔離級別。預設級別是 repeatable read可重複讀並通過間隙鎖next key locking策略 防止幻讀的出現。

innodb表是基於聚簇索引建立的。對主鍵查詢有很高的效能,它的二級索引非主鍵索引中必須包含主鍵列。

innodb通過一些機制和工具支援真正的熱備份。mysql的其他儲存引擎不支援熱備份。oracle提供的mysql enterprise backup. percona提供的開源xtrabackup都可以做到這一點

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

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

MySQL事務隔離級別

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

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...