1. 程式人生 > >mysql 開發進階篇系列 6 鎖問題

mysql 開發進階篇系列 6 鎖問題

訪問 vcc 不同 gin 存儲引擎 rhs 出現 詳細 方法

一.概述

  在數據庫中,數據是屬於共享資源,為了保證並發訪問的一致性,有效性,產生了鎖。接下來重點討論mysql鎖機制的特點,常見的鎖問題,以及解決mysql鎖問題的一些方法或建議。 相比其他數據庫,mysql 鎖機制比較簡單,顯著的特點是 不同的存儲引擎支持不同的鎖機制。在innodb中支持行鎖和表鎖,默認行鎖。

  mysql 的三種鎖歸納如下:
  表級鎖:開銷小,加鎖快,不會出現死鎖,鎖定粒度大,發生鎖沖突的概率最高,並發度最低。
  行級鎖:開銷大,加鎖慢;會出現死鎖,鎖定粒度最小,發生鎖沖突的概率最低,並發度最高。
  頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間,會出現死鎖,並發度一般。
  在不同sql語句執行,會采用不同的鎖,由mysql 內部自動加鎖,解鎖,以及對應的鎖類型。重點介紹mysql表鎖和innodb行鎖。由於MyisAm將被innodb取代了,後面重點講innodb。

1. 事務介紹

  innodb的二個特點是一是支持事務,二是采用行級鎖,但事務的引入也帶來了一些新問題,先介紹一下背景知識。

  1.1 事務及其屬性ACID
    事務是同一組sql語句組成的邏輯處理單元,具有原子性,一致性,隔離性,持久性。

  1.2 並發事務處理帶來的問題
    更新丟失,臟讀,不可重復讀,幻讀。

  1.3 事務隔離級別
    由於並發事務處理帶來的問題,那麽解決方法就是對應不同的事務隔離級別。 數據庫實現事務隔離的方式,基本上分為以下兩種:
    (1)一種是在讀取數據前,對其加鎖,阻止其他事務對數據進行修改。
    (2)另一種是不用加任何鎖,通過快照 Snapshot 形式的 “數據版本並發控制” (MultiVersion Concurrency Control)簡稱MVCC。
    數據庫的事務隔離級別越嚴格,並發副作用越小,付出的代價也就越大,因為實質上就是使事務在一定程度上"串行化"進行,這與"並發"是矛盾的。

    下面是四種隔離級別:

技術分享圖片

  

2. 隔離級別查看

-- 查看事務隔離級別,默認是REPEATABLE-READ,在sql server裏默認是Read Committed
SELECT @@tx_isolation

技術分享圖片

  關於事務,事務並發問題,事務隔離級別,它們的原理這裏有詳細介紹“sql server 鎖與事務撥雲見日”。(未完)

mysql 開發進階篇系列 6 鎖問題