Q:為什么要用鎖?什么樣的業務場景下需要用鎖?
就拿之前的工單系統來說,當審批方式為角色組審批時,代表該角色組內任意一人審批即可,這時,該角色組內成員的系統上都是可以顯示審批按鈕,如果此時A審批員和B審批員都同時審批了同一工單,有可能會出現不一樣的審批結果,即使審批意見是一致的,多人操作也會增加對數據庫的操作次數,同時也消耗了很大時間成本,用了鎖機制,確保這部分是只一人在操作。
Q:你知道MySQL有哪些鎖?
悲觀鎖、樂觀鎖 排它鎖、共享鎖 行級鎖、表級鎖
悲觀鎖:對每次訪問數據庫的操作都是抱有悲觀的態度,認為該操作會對數據庫做出修改,所以在訪問數據庫的時候就加了鎖
樂觀鎖:對每次訪問數據庫的操作都抱有樂觀的態度,只有在做出修改的時候才會上鎖
排它鎖:也稱為寫鎖,若事務A對數據A上了寫鎖,那么此時只允許事務A對數據A進行讀和寫的操作,不允許數據A再接受其他的鎖,直到排它鎖釋放之后
共享鎖:也稱為讀鎖,若事務A對數據A上了讀鎖,那么此時事務A只能讀取數據A並不能對其修改,也能接受其他事務對數據A的讀鎖
mysql數據庫引擎:MyISAM 和 InnoDB
MyISAM 采用表級鎖,不支持事務
InnoDB 默認行級鎖,也支持表級鎖
行級鎖:如根據主鍵id字段進行查找,並且查找到數據,主鍵字段就產生了行級鎖
表級鎖:根據非主鍵非索引字段進行查找,並且查找到數據,當前查找字段產生表級鎖
GIL全局解釋器鎖:GIL相當於互斥鎖,在解釋器層面上限制多線程同時執行,避免爭搶資源,保證同一時間只有一個線程在執行
Q:有了GIL全局解釋器鎖,為什么還要線程鎖?
因為cpu是分時分片的 當該協程指定時間內未完成任務時 需要用到線程鎖