修改被鎖分析

2022-08-20 01:33:10 字數 1976 閱讀 9916

⚠️ 基於可重複讀隔離級別

[原則1]加鎖基本單位是next-key lock,(前開後閉]

[原則2]查詢訪問到的物件才加鎖

[優化1]索引上的等值查詢,給唯一索引加鎖,next-key lock退化為行鎖

[優化2]索引上的等值查詢,向右遍歷時且最右乙個值不滿足等值條件時,next-key lock退化為間隙鎖。

[bug1]唯一索引上的範圍查詢會訪問到不滿足條件的第乙個值為止

所以 sessionb插入8被鎖住,而sessionc修改10這行是可以的。

但sessionc要插入乙個(7,7,7)但記錄,就被sessiona的間隙鎖鎖住。

所以,sessiona鎖的是主鍵索引上,行鎖id=10和next-key lock(10,15]

所以,sessiona在索引c上,加了(5,10]和(10,15]兩個next-key lock。

這裡需要掃瞄到c=15才停止掃瞄,是合理的,因為innodb要掃到c=15,才知道不需要繼續往後找了。

所以,sessionb跟新id=20被鎖住,sessionc插入id=16被鎖住。

insert into t values(30,10,30);
現在表裡有兩個c=10的行:

加鎖範圍如下:

左右兩邊都是虛線,表示開區間,即(c=5,id=5)和(c=15,id=15)這兩行上都沒有鎖。

在刪除資料的時候盡量加limit。這樣不僅可以控制刪除資料的條數,讓操作更安全,還可以減小加鎖的範圍

session b的next-key lock不是還沒申請成功嗎?

session b的「加next-key lock(5,10] 」操作,實際上分成了兩步,先是加(5,10)的間隙鎖,加鎖成功;然後加c=10的行鎖,這時候才被鎖住的。

在分析加鎖規則的時候可以用next-key lock來分析。但是要知道,具體執行的時候,是要分成間隙鎖行鎖兩段來執行的。

Oracle 行不能修改, 行被鎖

更新或刪除某條記錄的時候,無法操作,或被鎖解決 有的時候,讓我們在oracle上做update 或者delete的時候,出現上時間無法獲得操作結果,一直處於正在處理之中,這時候要考慮是否oracle本身對該記錄進行鎖住了。1 檢視記錄是否被鎖 select a.object id,a.session...

pl sql 資料修改不了問題(表被鎖了)

由於一些不當操作 死迴圈等 會使表直接被鎖死,做不了新增,修改等操作。此時pl sql 查詢表是否被鎖定 1.如下語句 查詢鎖定的表 select l.session id sid,s.serial l.locked mode,l.oracle username,l.os user name,s.m...

ORACLE頻繁被鎖

oracle頻繁被鎖 最近正式環境的系統經常出現資料庫連線錯誤,前面檢查幾個資料來源配置資訊無誤!最後查出原因為 該資料庫賬戶被鎖住了,之前覺得和納悶,誰會無聊把我們賬戶給鎖住了呢!第一次出現這樣的問題,我只能使用管理管賬號給該系統的資料庫賬戶解鎖了。但第二次發現被鎖後,這時就得找出原因了,最後查出...