mysql效能優化(三) 事務控制

2023-01-24 22:26:30 字數 3030 閱讀 4388

事務隔離級別

髒讀

不可重複讀

幻讀

未提交讀(read uncommited)

可能可能

可能已提交讀(read commited)

不可能可能

可能可重複讀(repeated read)

不可能不可能

對innodb不可能

序列化(serializable)

不可能不可能

不可能隔離級別到底如何實現的呢?鎖、mvcc

鎖是用於管理不同事務對共享資源的併發訪問

表鎖與行鎖的區別:

鎖定粒度:表鎖 > 行鎖

加鎖效率:表鎖 > 行鎖

衝突概率:表鎖 > 行鎖

併發效能:表鎖 < 行鎖

innodb儲存引擎支援行鎖和表鎖(另類的行鎖)

共享鎖(行鎖):shared locks

排它鎖(行鎖):exclusive locks

意向鎖共享鎖(表鎖):intention shared locks

意向鎖排它鎖(表鎖):intention exclusive locks

自增鎖:auto-inc locks

記錄鎖 record locks

間隙鎖 gap locks

臨鍵鎖 next-key locks

共享鎖:又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖, 都能訪問到資料,但是隻能讀不能修改;

加鎖釋鎖方式:select * from users where id=1 lock in share mode;  commit/rollback;

排他鎖:又稱為寫鎖,簡稱x鎖,排他鎖不能與其他鎖並存,如一個事務獲取了一個資料行的排他 鎖,其他事務就不能再獲取該行的鎖(共享鎖、排他鎖),只有該獲取了排他鎖的事務是可以對 資料行進行讀取和修改,(其他事務要讀取資料可來自於快照)

加鎖釋鎖方式:

delete / update / insert 預設加上x鎖

select * from table_name where ... for update commit/rollback

innodb的行鎖是通過給索引上的索引項加鎖來實現的。

只有通過索引條件進行資料檢索,innodb才使用行級鎖,否則,innodb 將使用表鎖(鎖住索引的所有記錄)

表鎖:lock tables xx read/write;

意向共享鎖(is)

表示事務準備給資料行加入共享鎖,即一個資料行加共享鎖前必須先取得該表的is鎖, 意向共享鎖之間是可以相互相容的

意向排它鎖(ix)

表示事務準備給資料行加入排他鎖,即一個資料行加排他鎖前必須先取得該表的ix鎖, 意向排它鎖之間是可以相互相容的

意向鎖(is、ix)是innodb資料操作之前自動加的,不需要使用者干預

意義:

當事務想去進行鎖表時,可以先判斷意向鎖是否存在,存在時則可快速返回該表不能 啟用表鎖

針對自增列自增長的一個特殊的表級別鎖

show variables like 'innodb_autoinc_lock_mode';

預設取值1,代表連續,事務未提交id永久丟失

record locks:

鎖住具體的索引項

當sql執行按照唯一性(primary key、unique key)索引進行資料的檢索時,查詢條件等值匹 配且查詢的資料是存在,這時sql語句加上的鎖即為記錄鎖record locks,鎖住具體的索引項

gap locks:

鎖住資料不存在的區間(左開右開)

當sql執行按照索引進行資料的檢索時,查詢條件的資料不存在,這時sql語句加上的鎖即為 gap locks,鎖住索引不存在的區間(左開右開)

next-key locks:

鎖住記錄+區間(左開右閉)

當sql執行按照索引進行資料的檢索時,查詢條件為範圍查詢(between and、等)並有數 據命中則此時sql語句加上的鎖為next-key locks,鎖住索引的記錄+區間(左開右閉)

為什麼innodb選擇臨鍵鎖next-key作為行鎖的預設演算法?

gap只在rr事務隔離級別存在

使用排它鎖

使用共享鎖

使用臨鍵鎖

多個併發事務(2個或者以上);

每個事務都持有鎖(或者是已經在等待鎖);

每個事務都需要再繼續持有鎖;

事務之間產生加鎖的迴圈等待,形成死鎖。

1)類似的業務邏輯以固定的順序訪問表和行。

2)大事務拆小。大事務更傾向於死鎖,如果業務允許,將大事務拆小。

3)在同一個事務中,儘可能做到一次鎖定所需要的所有資源,減少死鎖概 率。

4)降低隔離級別,如果業務允許,將隔離級別調低也是較好的選擇

5)為表新增合理的索引。可以看到如果不走索引將會為表的每一行記錄添 加上鎖(或者說是表鎖)

mvcc:

multiversion concurrency control (多版本併發控制)

併發訪問(讀或寫)資料庫時,對正在事務內處理的資料做 多版本的管理。以達到用來避免寫操作的堵塞,從而引發讀操 作的併發問題。

MySQL效能優化 事務管理基本概念

本教程僅為本人的學習筆記,如有錯誤,請指出,歡迎 事務的概念 一個事務是對資料庫進行讀和寫的一個序列。事務管理的目的 1 為資料庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。2 當多個應用程式在併發訪問資料庫時,可以在這些應用程式之間提供一個隔離...

MySQL效能優化 三 索引

如果一本新華字典假如沒有目錄,想要查詢某個字,就不得不從第一頁開始查詢,一直找到最後一頁 如果要找的字在最後一頁 這個過程非常耗時,這種場景相當於資料庫中的全表掃描的概念,也就是迴圈表中的每一條記錄看看該記錄是否滿足條件,掃描次數為表的總記錄數。新華字典中都會有目錄都有查詢方法 比如按拼音查詢 按部...

MYSQL 事務控制

事務 transaction 是指作為一個邏輯工作單元執行的一系列操作,這些操作要麼全部成功,要麼 全部失敗。事務確保對多個資料的修改作為一個單元來處理。在mysql中,只有使用了innodb儲存引擎的資料庫或表才支援事務。事務用於維護資料庫的完整性,保證成批的sql語句要麼都執行,要麼都不執行。事...