樂觀鎖與悲觀鎖是并發控制中兩種不同的思路。樂觀鎖是指在并發環境中,每個線程都認為自己可以順利地完成任務,不需要加鎖,只有在更新數據時去判斷此時數據是否被其他線程更新過,如果沒有就更新成功,如果有則失敗。使用樂觀鎖的情況:
1. 并發量小:當并發量較小時,使用樂觀鎖效果比較好。因為并發情況不復雜,數據相對于來說不容易出現沖突,且線程競爭較少,可以避免加鎖等操作帶來的額外開銷,提高系統性能。
2. 數據操作較少:如果數據操作較低頻率,那么使用樂觀鎖的成本也相對較低。在高并發場景下,加鎖釋放鎖的開銷和阻塞時間特別大,可以通過樂觀鎖來優化,減少耗時。
3. 不會發生沖突的情況:如果并發量大,加鎖操作也會帶來很大的開銷。此時,如果可以預測此時不會發生沖突時,用樂觀鎖就可以避免加鎖操作,從而提升效率。
事實上,樂觀鎖常常用于針對高并發量的場景,它可以降低系統開銷,提高效率。但是,當數據更新時沖突概率比較高、競爭比較激烈、鎖等待時間長,則需要考慮采用悲觀鎖來保障數據的正確性。
// 樂觀鎖實現 UPDATE table SET column = newvalue, version=version+1 WHERE id = ? AND version = ?;