數據一致性處理

數據一致性處理

      當多個進程同時操作同一個數據,會產生資源爭搶,數據一致性的問題。

       高併發情況下,涉及到寫操作時,不可能直接操作數據庫,大併發的連接會導致mysql請求會阻塞,比如大量的insert update 請求到,會直接導致無數的行鎖和表鎖,甚至最後堆積很多,從來觸發too many connections 錯誤。

     web服務器 nginx和apache連接的進程有限,cpu上下文進程切換也會增加額外的開銷,所以響應一定快。

      這時可以採用

     高併發下的數據安全,防超發,以搶票系統爲例:

    (1)消息隊列:

        將票數資源存在redis中,將請求存入消息隊列(redis下的list阻塞的,可以實現消息隊列,還可以實現優先消息隊列)中,依次處理。缺點 :這樣會處理比較慢,等待時間比較長。

    

:對於讀操作是否也進入隊列,這個問題根據具體的場景,像12306應該是不在隊列中或者是優先排在最前面的,因爲只是讀,要求塊。 

(2)加鎖

      常見的鎖:        排它鎖;樂觀鎖;悲觀鎖;

      排他鎖:在進行寫時,禁止一切的讀和寫;

      樂觀鎖:認爲在寫的時候,別人不在寫,維護一個version號,等處理後對照version好,一致則對,否則回滾,操作不成功,

      悲觀鎖:認爲在寫的時候,別人也在寫。採用數據庫提供的鎖機制:在寫操作的時(insert updata 等)myisam默認是鎖表,innodb根據是否是主鍵,主鍵則行鎖,否則表鎖。讀操作,innodb採用mvcc。

     可以採用樂觀鎖+回滾:

       

    採用悲觀鎖:

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章