mysql更改死鎖粒度 Mysql總結之事務 鎖

2021-10-17 22:45:03 字數 2156 閱讀 9679

前言

mysql部分到此結束

正文什麼是事務是資料庫最小的工作單元,不可再拆分。

可能包含乙個或者一系列的dml語句,包括insert,update,delete。(當然ddl,dcl也會包含事務)

事務特性原子性:一次多個操作要麼都成功,要麼都失敗。通過undo.log實現回滾,保證原子性。

隔離性:多個事務之間互不影響。通過mvcc + lbcc實現。

永續性:事務提交成功,結果應當寫入磁碟。通過duuble write pool(雙寫緩衝)+redo.log實現。

一致性:事務開啟前結束後,資料都是合法的狀態。通過原子性+隔離性+永續性前三種特性來保證這一特性。

前提知識事務都是有編號的,且會不斷遞增

innodb為每行資料都設定了兩個隱藏欄位db_trx_id:事務id,此資料是在哪個事務插入或者修改為新資料的,就記錄為當前事務id。

db_roll_ptr:回滾指標,刪除版本號,正常為null,當資料被刪除或者記錄為舊資料(即被修改)時,記錄當前事務id。

mvcc (多版本併發控制)只能查詢建立時間小於等於當前事務id的資料,和刪除時間大於當前事務id的行(或者未刪除)。

undo.log鏈當乙個資料被標記為舊版本(即被修改)時,是被存在undo.log中的。

同一條資料被修改了多次,這些同一條資料的舊版本就會形成了乙個鏈條,叫做undo.log鏈。

前面的db_roll_ptr就是指向undo.log的指標。

具體是如何儲存的這裡就不詳細說了,有點複雜。

簡單來說,就是可以通過這個字段拿到屬於自己可以拿到的舊版本,生成快照。 =.=

lbcc

鎖的粒度行鎖

表鎖鎖的型別共享鎖:只能讀,不能寫

排他鎖:不能讀寫

意向鎖:加鎖前申請意向鎖,提高加鎖效率。

行鎖原理通過索引進行加鎖,未走索引會造成表鎖。

行鎖的演算法以下內容都是在預設rr隔離級別下

record lock(記錄鎖)主鍵值即record,如上圖:資料庫裡有兩條資料key為10和20,這就是對應兩個記錄鎖

對唯一索引/主鍵索引進行等值加鎖查詢即產生記錄鎖(對於普通索引加鎖範圍不了解)

gap lock(間隙鎖)record之間不存在的區間(左開右開),即為間隙鎖。

當我們的查詢未命中乙個record,無論是等值還是範圍查詢都會產生這個範圍內的間隙鎖。

next-key lock(臨建鎖)record lock+ 其左邊的gap lock即為臨建鎖,範圍左開右邊閉。

當我們使用範圍查詢命中了一條資料時,會鎖住下個key的左開右閉區間。

例:如上圖所示內容:select * from table where key >8 and key<15;

結果:會產生gap lock1+record lock1+gap lock2+record lock2 即(0,10]+(10,20]

原因:主要為了解決幻讀的問題,這也是為啥innodb在rr級別下就解決了幻讀。

事務總結

read-uncommitedru不加鎖

serializable所有select會被隱氏的轉換成select ... in share mode ,會和update、delete互斥。

repeatable-read預設隔離級別

普通select使用快照讀,底層使用mvcc實現。

加鎖的select,update,delete等語句使用當前讀,底層使用記錄鎖,或者間隙鎖,臨建鎖,。

read-commited普通select使用快照讀,底層使用mvcc實現。

加鎖的select,update,delete等語句使用當前讀,底層使用記錄鎖,其沒有間隙鎖。

避免死鎖操作多張表時,按照固定的順序進行訪問(避免環路等待)。

批量操作單錶多個資料,先進行排序,即按照一定順序訪問(避免環路等待)。

申請足夠級別的鎖,如果要運算元據,就申請排他鎖。

盡量使用索引去訪問資料,避免鎖表。

大事務轉化成小事務(這裡是大化小,還是小化大看情況而定)。

使用等職查詢而不是範圍查詢,避免間隙鎖的影響。

mysql事務粒度

簡潔說明 由於現在面向框架開發,使用事務只需要在方法上新增 transactional註解,但是也需要注意不能隨意使用。例如 方法的執行邏輯中只有一句查詢語句,或只有一句更新 插入,這種情況沒有必要設定事務,若需要校驗執行 結果,可以使用 邏輯判斷。即使出現異常,也只會影響上層邏輯,並不會造成其他業...

mysq 死鎖問題解決

1 查詢是否存在死鎖 show open tables where in use 0 2 查詢死鎖itrx mysql thread id select from information schema.innodb trx 命令是用來檢視當前執行的所以事務 select from informati...

mysql 死鎖語句 MySQL死鎖

死鎖產生 行鎖的具體實現演算法有三種 record lock gap lock以及next key lock。record lock是專門對索引項加鎖 gap lock是對索引項之間的間隙加鎖 next key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。只在可重複讀或以上隔離級別下的特...