樂觀鎖 vs 悲觀鎖
前言
在介紹什麼是樂觀鎖、什麼是悲觀鎖之前,我們先來了解一下,這兩個鎖是應用在什麼地方?
資料庫
資料庫是用來處理資料的讀取與寫入,而資料庫的交易行為 (transaction) 必須符合 ACID,其中的 I 為 Isolation,指的是資料庫在對同個資料同時進行多筆交易時,必須避免產生資料的不一致。
白話的意思是,當大家在搶購五月天演唱會的門票時,其中有一萬個人同一時間點選了 A 區第 B 排的序號 5 的座位,資料庫不能讓這一萬個人全部都買到票,只能有一位幸運兒得到,也就是只能有一位使用者能成功將其資訊寫入資料庫。
為了達成這件萬中選一的情況,就必須使用到「鎖」的概念。
悲觀鎖
從字面上來想,可以很清楚的知道,這個鎖是用悲觀來看待資料的寫入。基於對事件的不信任,所採取的行為。
悲觀鎖的概念是,眾多行為裡,只有一個行為能被接受,其餘的行為必須等待前面的行為結束。
像是,學校老師在所有學生同時發問時,很難完整接收到大家的問題,為了避免這樣的狀況發生,我想老師一定會要求學生「一個一個」發問,小明問完,小美才能接著問,小美問完,小華才能繼續問,直到所有問題都問完,或是老師要下班離開了。這樣的操作就是悲觀鎖的概念。
在資料庫的 Isolation,就是悲觀鎖的概念,為的就是避免在眾多使用者同時對同一筆資料進行任何改動的操作(資料爭用激烈)時,導致資料或數據的不一致。
樂觀鎖
樂觀鎖就是跟悲觀鎖相反的概念,它不會對任何的 transaction 進行限制,所以通常會是在「資料爭用」狀況小、使用者們的操作對彼此的影響小的時候採用樂觀鎖。