分布式編程下的CAS
最近在項目中發現兩個概率性數據被覆蓋的問題,跟蹤原因后發現都是由於並發引起的。解決方案都是更新數據時對比數據是否發生變化,如果沒有發生變化,那么才更新數據。這種做法就是CAS(Compare And Set),下文是對CAS應用思想的思考。
在談CAS之前先例舉上面說到的一個問題,問題如下:低概率會發生人工翻譯的數據被機器翻譯覆蓋現象。在業務場景中人工翻譯數據優先級比機器翻譯高,為什么人工翻譯數據還是會被機器翻譯覆蓋呢?
在多用戶環境下,會出現兩種典型的並發問題:丟失更新、臟讀。上述問題就是丟失更新問題。
並發控制有兩種機制:
悲觀鎖:假定會發生並發沖突,屏蔽一切可能違反數據完整性的操作。
樂觀鎖:假設不會發生並發沖突,只在提交操作時檢查是否違反數據完整性。
CAS就是樂觀鎖的一種應用場景,簡單的原理就是:在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做。
上述翻譯的場景中人工翻譯數據會被機器覆蓋,是因為機器翻譯先讀取數據A進行翻譯,還沒有翻譯完成就被人工修改為B,當機器翻譯完后又把數據更新為了A。那么只要在機器翻譯完后更新數據時,判斷數據是否為A。如果為A才更新數據,如果不為A,則不更新數據。這樣就可以解決這個概率產生的問題。
其實CAS只是一個很簡單的思想,理解起來也非常容易,關鍵在於在復雜且干擾性非常大的應用場景使用CAS的思想。