MySQL面试题 | 附答案解析(十)
接上篇:鎖
5. MySQL中InnoDB引擎的行鎖是怎么實現的?
答:InnoDB是基于索引來完成行鎖例: select * from tab_with_index where id = 1 for update;for update 可以根據條件來完成行鎖鎖定,并且 id 是有索引鍵的列,如果 id 不是索引鍵那么InnoDB將完成表鎖,并發將無從談起
6. InnoDB存儲引擎的鎖的算法有三種
1.Record lock:單個行記錄上的鎖
2.Gap lock:間隙鎖,鎖定一個范圍,不包括記錄本身
3.Next-key lock:record+gap 鎖定一個范圍,包含記錄本身相關知識點:
1.innodb對于行的查詢使用next-key lock
2.Next-locking keying為了解決Phantom Problem幻讀問題
3.當查詢的索引含有唯一屬性時,將next-key lock降級為record key
4.Gap鎖設計的目的是為了阻止多個事務將記錄插入到同一范圍內,而這會導致幻讀問題的產生
5.有兩種方式顯式關閉gap鎖:(除了外鍵約束和唯一性檢查外,其余情況僅使用record lock) A. 將事務隔離級別設置為RC B. 將參數innodb_locks_unsafe_for_binlog設置為1
7. 什么是死鎖?怎么解決?
死鎖是指兩個或多個事務在同一資源上相互占用,并請求鎖定對方的資源,從而導致惡性循環的現象。常見的解決死鎖的方法
1、如果不同程序會并發存取多個表,盡量約定以相同的順序訪問表,可以大大降低死鎖機會。
2、在同一個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率;
3、對于非常容易產生死鎖的業務部分,可以嘗試使用升級鎖定顆粒度,通過表級鎖定來減少死鎖產生的概率;如果業務處理不好可以用分布式事務鎖或者使用樂觀鎖
8. 數據庫的樂觀鎖和悲觀鎖是什么?怎么實現的?
數據庫管理系統(DBMS)中的并發控制的任務是確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性。樂觀并發控制(樂觀鎖)和悲觀并發控制(悲觀鎖)是并發控制主要采用的技術手段。
1.悲觀鎖:假定會發生并發沖突,屏蔽一切可能違反數據完整性的操作。在查詢完數據的時候就把事務鎖起來,直到提交事務。實現方式:使用數據庫中的鎖機制
2.樂觀鎖:假設不會發生并發沖突,只在提交操作時檢查是否違反數據完整性。在修改數據的時候把事務鎖起來,通過version的方式來進行鎖定。實現方式:樂一般會使用版本號機制或CAS算法實現。兩種鎖的使用場景從上面對兩種鎖的介紹,我們知道兩種鎖各有優缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果是多寫的情況,一般會經常產生沖突,這就會導致上層應用會不斷的進行retry,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適。
最后,小編分類整理了許多java進階學習材料和BAT面試給熱愛IT行業的你,如果需要資料的請轉發此文章后再私聊小編回復【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領取海量學習資料進行學習。
總結
以上是生活随笔為你收集整理的MySQL面试题 | 附答案解析(十)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿想做就能做吗
- 下一篇: MySQL面试题 | 附答案解析(十一)