● 一般情況下, 沒有用鎖。 資料庫隱式加了:
●表鎖:對整個表 加鎖,開銷小,加鎖快;不會出現死鎖, 鎖定粒度大;●表鎖分兩種: ●行鎖發生鎖衝突概率高, 併發度底
對 某一行 加鎖,開銷大, 加鎖慢, 會出現死鎖; 鎖定 粒度小;發生鎖衝突的概率底, 併發度高●innodb 支援行鎖 和 表鎖, 其中行鎖是 基於索引 的, 只有通過索引條件 檢索資料 才會 使用行鎖,否則 則是表鎖
●myisam 只支援表鎖
●為了 允許 行鎖 和 表鎖 共存, 實現多 顆粒機制。 innodb 還有 意向鎖(intention locks):
● 事務在 嘗試獲取 所需要的 行鎖時, 會先通過 意向鎖 檢查 表鎖占用情況, 再決定是否繼續 獲得 行鎖,判斷規則: ● 意向鎖 負責 協調 行鎖 和 表鎖 之間 關係。意向鎖 由 資料庫 自動完成, 程式設計師 無需 手動參與● ix 排它鎖, is 共享鎖, 只和 表級 的 x, s 發生衝突, 和 行級的 x, s 鎖 不衝突。 意向鎖 是 在新增 行鎖 之前 新增的。 當向乙個 表 新增 表級 x 鎖的時候, 如何沒有 意向鎖。 需要遍歷 整個 表 判斷 是否 有 行鎖存在。 以免發生衝突。 有了意向鎖, 只需判斷 該意向鎖 與 即將新增的 表級 鎖 是否 相容即可。 應為 意向鎖的 存在 意味著 有行級鎖的存在。 或者 即將有 行級鎖的 存在。 因而無需 遍歷整個 表。即可獲取結果, 提高了加鎖的效率。
● 另外,行鎖的事務 a 獲取了 表 x 鎖之後, 如果 沒有 ix, 事務 b 還可以 獲得 行 x 鎖, 因此 行鎖 獲得 和 表鎖 沒有 任何關係, 表鎖 失去對行鎖的控制, 應為需要 ix 鎖, 來協調
● 樂觀鎖
● 表中有乙個版本 字段, 第一次讀的時候 獲取到這個字段。 處理完 業務邏輯開始更新的時候。 需要再次檢視 該字段的值 是否和 第一次的一樣。 如果一樣則更新, 反之 拒絕,之後索引叫 樂觀鎖,是應為這個模式沒有從 資料庫 加鎖。等到 更新的時候 在 判斷是否 可以更新● 悲觀鎖● update mytable set name = 'tom' verson = verson+1 where id = # and verson = #
● select * from mytable for update● 在 select 語句後邊 加上 for update 相當於加上了 排它鎖(寫鎖), 加了寫鎖以後, 其他的事務 就 不能對它 修改了。需要等待當前事務 修改完畢 之後 才能 修改
● 當用範圍條件檢索 資料 並且 請求 共享鎖 或 排他鎖 時, innodb 會給 符合範圍 條件的 以有的資料記錄的索引 項加鎖。 對於鍵值 在 條件範圍 內 但 並不存在的 記錄, 稱為 『間隙』 (gap)。 innodb 會對 『間隙』 加鎖 即 間隙鎖; 比如:
● 間隙鎖的 目的:防止幻度(repeatable read 隔離級別下通過 gap 避免了 幻讀)
訪問 表 和 行順序 固定, 如兩個 批量更新 job, 對 id列表 先 排序, 後執行。 避免交叉鎖 情形; 又如 對兩個事務的 sql 順序 調整為一致, 也能避免 死鎖使用小事務, 大事務 更傾向於 死鎖, 如果 業務允許 將大事務 拆 小
一次鎖定, 在同乙個事務 中, 盡可能 做到一次 鎖定 所需要的所有 資源, 減少 死鎖的 概率
降低 隔離級別, 如將隔離級別 從 pr 調整為 rc, 可以避免因 gap 鎖 操作的 死鎖
為表 新增 合理索引, 如果 不索引 將會為表的 每一行記錄加鎖。 死鎖的 概率 增大
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...
mysql鎖與索引
當走索引就是使用行鎖,當索引失效就會使用表鎖 對索引使用一下操作導致索引失效 預先關閉自動提交事務功能 set autocommit 0 視窗a執行更新語句,當前事務對其他食物不可見 已提交讀 update test innodb lock set b a1 where a 1 select fro...
mysql鎖機制 php Mysql鎖機制
表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...