首先談談它們的共同點吧:它們本質上都是一種對資源的獨占鎖定,都是由並發引起(如果數據庫只有一個session,就談不上鎖定)。
接著著重談談它們的不同點:
首先,它們的目的不一樣,enqueue (即Lock,Oracle官方文檔混合使用這兩個名詞,在等待事件裡,可以看到大量的enqueue,其實就是lock)是為了解決業務層面的數據爭用,而latch是為了解決內存資源的爭用。
其次,它們的運行方式不一樣,enqueue采用排隊方式,先到先得,而latch的競爭近乎無序,以一種隨機的方式,先到不一定先得,得靠搶,而且它還以一種時間片輪訓的方式,不會一直霸占,即時還沒運行完,時間片一到也。
第三,會話持有的時長不一樣,enqueue根據業務情況,可能會持有較長時間,而latch通常非常短。第四,引起的原因不一樣,enqueue太多通常是業務設計的問題,而latch過多,一般是數據庫層面的問題(如未使用綁定變量、表或索引熱塊等)。