鎖機制用來管理對共享檔案的併發訪問。innodb會在資料庫內部多個地方使用鎖,從而允許對多種不同資源提供併發訪問。
1.1 鎖的型別
innodb實現了如下兩種標準的行級鎖:
共享鎖(讀鎖):允許事務讀一行資料
排他鎖(寫鎖):允許事務刪除或更新一行資料
innodb引擎支援多粒度的鎖定,允許行級鎖和表級鎖同時存在。為了支援在不同的粒度上進行加鎖,innodb支援一種叫意向鎖的加鎖方式,並且在此引擎上意向鎖的鎖粒度是表級。
個人理解的意向鎖的應用場景:事務a想給表1所有行加排他鎖,必然要先給表1加意向排他鎖,而此時如果檢測到事務b給表1加上了意向共享鎖,說明表1中某行或者幾行記錄被加了共享鎖。此時就進行等待,等事務b對錶1的操作執行完畢撤銷共享鎖再由事務a加排他鎖。意向鎖的好處凸顯在這個地方:意向共享鎖昭示了表中有共享鎖的存在,如果沒有這個提示,事務a向全表加排他鎖而表中某行還有共享鎖存在,就發生了衝突。(當然這種情景建立在 有乙個事務對錶的操作是全表掃瞄 的基礎上)
1.2一致性非鎖定讀
一致性的非鎖定讀是指innodb儲存引擎通過行多版本控制的方式來讀取當前執行時間資料庫中行的資料。如果此行正在進行別的操作,這時候讀取操作不會進行等待,而是讀取此行的乙個快照資料。這個快照資料是指該行之前版本的資料,通過undo段來實現。此種技術稱為多版本併發控制(mvcc)
mvcc原理:
主要用來解決讀寫衝突。關鍵字:隱式字段、undo日誌、read view
① 先來認識兩個概念:
當前讀:讀取記錄的最新版本,且讀取時還要保證其他併發事務都不能修改當前記錄,對讀取的記錄進行加鎖
快照讀:不加鎖的select就是快照讀,讀到的資料是之前的歷史版本,不需要進行加鎖操作。前提是隔離級別不是序列級別。讀提交級別的快照讀是每次select都生成乙個快照讀;可重複讀級別的快照讀是開啟事務後第乙個select語句進行快照讀。
② 隱式字段:
③ undo日誌
1.3 一致性鎖定讀
有兩種一致性鎖定讀的語句:
①select … from update 對記錄加x鎖,其他事務不能加任何鎖
②select … lock in share mode 對事務加s鎖,其他事務可加s鎖不可加x鎖
2.1 髒讀
髒資料是指事務對緩衝池中行記錄進行修改,並且還沒有提交,如果另乙個事務讀取到了這個資料,就稱之為髒讀。髒讀的解決辦法是將隔離級別提公升到讀提交。
2.2 不可重複讀
是指乙個事務多次執行select語句時,因為中間有別的事務對資料進行了改變,導致查詢到的資料不一樣。不可重複讀的解決方法是將隔離級別提公升至可重複讀。
與它有點相似的問題叫幻讀,主要是中間事務做的操作說新增而不是修改。
3.1 死鎖概念
兩個或兩個以上的事務在執行過程中,因爭奪鎖資源而造成一種互相等待的現象。
解決死鎖最簡單的辦法是超時:當乙個事務的等待時間超過某個閾值時,事務進行回滾,這樣其他事務就有可能推進下去了。
另乙個方法是建立等待圖,等待圖需要兩個資訊:鎖的資訊鍊錶和事務等待鍊錶,通過這兩個鍊錶構造一張圖,如果圖有迴路,代表有死鎖,此時innodb選擇回滾undo量最小的事務。
3.2 乙個資料庫死鎖例子
資料庫(2)資料庫鎖
這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。二.事物隔離等級和鎖的關係 網上很多部落格都是直接說了一連串的鎖,什麼悲觀鎖樂觀鎖,什麼讀寫鎖,什麼排他鎖共享鎖。說的不僅語焉不詳,而且分類紊亂,希望看到這篇文章能幫助你理清思路。從鎖的實現方式來看,鎖可以分為悲觀鎖和...
關於資料庫日誌log
先檢視日誌log如何被呼叫的,在tsql中執行 exec master.dbo.sp enumerrorlogs 顯示結果為 有了存檔號,接著檢視某乙個日誌檔案異常大的log內容 圖中的異常日誌已經被清除了,所以這裡記錄的時候暫且認為存檔 為4的日誌是異常大檔案 接下來看看存檔4的log內容,在ts...
mysql資料庫鎖 MySQL資料庫的鎖機制
在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...