關於 mysql 鎖的疑問

來源:互聯網
上載者:User
關鍵字 php mysql 資料庫
mysql 資料庫,表的概念是對使用者而言的嗎?使用者A鎖了某個表,使用者B就會受鎖影響,是這樣嗎?
如果是,在一個網站站中,操作資料庫都是同一個使用者,這時候鎖還起作用嗎?
如果不是,又應該怎麼理解?

回複內容:

mysql 資料庫,表的概念是對使用者而言的嗎?使用者A鎖了某個表,使用者B就會受鎖影響,是這樣嗎?
如果是,在一個網站站中,操作資料庫都是同一個使用者,這時候鎖還起作用嗎?
如果不是,又應該怎麼理解?

鎖定是針對請求而言的。
MySQL表鎖定分為讀鎖定和寫鎖定,主要通過四個隊列來維護:兩個存放正在鎖定中的讀寫鎖定資訊,兩個存放等待中的讀寫鎖定資訊。

如下: • Current read-lock queue (lock->read) • Pending read-lock queue
(lock->read_wait) • Current write-lock queue (lock->write) • Pending
write-lock queue (lock->write_wait) 當前持有讀鎖的所有線程的相關資訊都能夠在 Current
read-lock queue 中找到,隊列中的資訊按 照擷取到鎖的時間依序存放。而正在等待鎖定資源的資訊則存放在 Pending
read-lock queue 裡面,另 外兩個存放寫鎖資訊的隊列也按照上面相同規則來存放資訊。

讀鎖定 一個新的用戶端請求在申請擷取讀鎖定資源的時候,需要滿足兩個條件: 1、 請求鎖定資源當前沒有被寫鎖定;
2、寫鎖定等待隊列(Pending write-lock queue)中沒有更高優先順序的寫鎖定等待;
如果滿足了上面兩個條件之後,該請求會被立即通過,並將相關的資訊存入 Current read-lock queue
中,而如果上面兩個條件中任何一個沒有滿足,都會被迫進入等待隊列Pending read-lock queue 中等待資源的釋放。 寫鎖定
當用戶端請求寫鎖定的時候,MySQL 首先檢查在 Current write-lock queue 是否已經有鎖定相同資 源的資訊存在。
如果 Current write-lock queue 沒有,則再檢查 Pending write-lock queue,如果在
Pending write-lock queue 中找到了,自己也需要進入等待隊列並暫停自身線程等待鎖定資源。反之,如果 Pending
write-lock queue 為空白,則再檢測 Current read-lock queue,如果有鎖定存在,則同樣需要 進入
Pending write-lock queue 等待。當然,也可能遇到以下這兩種特殊情況:

  1. 請求鎖定的類型為 WRITE_DELAYED;

  2. 請求鎖定的類型為 WRITE_CONCURRENT_INSERT 或者是 TL_WRITE_ALLOW_WRITE ,同時 Current read lock 是 READ_NO_INSERT 的鎖定類型。
    當遇到這兩種特殊情況的時候,寫鎖定會立即獲得而進入Current write-lock queue 中 如果剛開始第一次檢測就

Current write-lock queue 中已經存在了鎖定相同資源的寫鎖定存在,那 麼就只能進入等待隊列等待相應資源鎖定的釋放了。
讀請求和寫等待隊列中的寫鎖請求的優先順序規則主要為以下規則決定:

  1. 除了 READ_HIGH_PRIORITY 的讀鎖定之外,Pending write-lock queue 中的 WRITE 寫鎖定能夠阻 塞所有其他的讀鎖定;

  2. READ_HIGH_PRIORITY 讀鎖定的請求能夠阻塞所有 Pending write-lock queue 中的寫鎖定;

  3. 除了 WRITE 寫鎖定之外,Pending write-lock queue 中的其他任何寫鎖定都比讀鎖定的優先順序 低。 寫鎖定出現在 Current write-lock queue 之後,會阻塞除了以下情況下的所有其他鎖定的請求:

  4. 在某些儲存引擎的允許下,可以允許一個WRITE_CONCURRENT_INSERT 寫鎖定請求

  5. 寫鎖定為 WRITE_ALLOW_WRITE 的時候,允許除了 WRITE_ONLY 之外的所有讀和寫鎖定請求

  6. 寫鎖定為 WRITE_ALLOW_READ 的時候,允許除了 READ_NO_INSERT 之外的所有讀鎖定請求

  7. 寫鎖定為 WRITE_DELAYED 的時候,允許除了 READ_NO_INSERT 之外的所有讀鎖定請求

  8. 寫鎖定為 WRITE_CONCURRENT_INSERT 的時候,允許除了 READ_NO_INSERT 之外的所有讀鎖定請求

鎖是用來解決多個進程同時處理同一個資料時的競爭問題的。

InnoDB引擎最小的鎖粒度是行級鎖。當2個請求同時修改某一行紀錄時,就會給這個事務上行級鎖。

跟使用者不使用者沒啥鳥關係。

鎖表是對資料庫資料表而言的,表一鎖,這個表壓根無法訪問,就更別討論哪個使用者了

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.