網頁

2020/8/21

資料庫 交易的悲觀鎖與樂觀鎖 Transaction pessimistic and optimistic locking

資料庫交易特性ACID中的交易隔離(Isolation)通常利用「鎖(locking)」來實現,目的為避免同一筆資料在併行交易(concurrent transaction)中被不同的交易同時修改以確保資料的完整性。

交易鎖又分為「悲觀鎖(pessimistic locking)」與「樂觀鎖(optimistic locking)」。


悲觀鎖(Pessimistic Locking)


悲觀鎖過資料庫自身的鎖機制限制資料同時間只能被個一個交易存取。



悲觀鎖假設同一筆資料總是被多筆交易同時存取,所以交易開始即鎖住該筆資料,直到該筆交易完成後才釋放,其他交易才能接著存取,也就是一次只能有一筆交易存取該資料。

悲觀鎖通常利用資料庫本身的鎖機制(例如Oracle的SELECT FOR UPDATE)。資料限制只能被一筆交易存取,好處是保證資料的完整性,壞處是效能較差,而且可能產生死鎖(deadlock)。


樂觀鎖(Optimistic Locking)

樂觀鎖透過提交前檢查異動資料的版本號或時間日期來決定是否完成交易。



樂觀鎖假設同一筆資料不會被多筆交易同時存取,因此交易存取時不鎖住該筆資料,在提交修改前再次讀取該筆資料並檢查是否被其他交易修改過,若被其他交易修改或則拋錯並回滾;若未被其他交易修改則更新版本號並提交修改。

樂觀鎖則在應用系統層級實現以上邏輯。資料能被多筆交易同時存取。好處是效能較好,不會產生死鎖;壞處是無法保證交易隔離(ABA問題),因此通常透過檢查該筆資料的版本號(version)或時間戳(timestamp)是否相同。且若另一系統未實現以上邏輯則鎖會被破壞。


沒有留言:

張貼留言